2017-01-19 12 views
0

のは、私はこの機能(try online)を持っているとしましょう:パラメータが定義されていない場合は、未定義返す関数を入力

type Person = { name: string } 
function getName(p: ?Person): ?string { 
    if (!p) { 
    return p 
    } else { 
    return p.name 
    } 
} 

const frank: Person = { name: 'Frank' } 
/* 
* In order to work now, this has to have a maybe type 
* const name: ?string = getName(frank) 
* Even though I know it will is guaranteed to be a string 
*/ 
const name: string = getName(frank) 

フローgetNameundefinedを返すことができると思うので、私は、エラーを取得します。これが起こるだけですが、pが定義されていないと、明らかにそうではありません。

何らかの形で関数を入力することができます。戻り値の型はundefinedで、パラメータがundefinedの場合のみ、そうでない場合は文字列ですか?そう

function getName(person) { 
    if (! person) { 
    return undefined 
    } else { 
    return person.name 
    } 
} 

const maybeFrank: ?Person = getFrank() 
const definitelyMaria: Person = getMaria() 

const frankName: ?string = getName(maybeFrank) 
const mariaName: string = getName(definitelyMaria) 

は、私は方法でそれを入力したいと思い、::私は簡単な機能を持っている :

クラリファイン例:編集


  • 場合は、パラメータはJust Person、戻り値の型はJust Stringです。
  • パラメータが多分人の場合、戻り値の型は多分文字列

それは可能ですか?

+0

と機能を再宣言することができますしたい場合、私は疑問があることでしょうね、なぜ '=率直&&のgetName(率直)を行いません'へ最初に 'undefined'にならないようにしてください。 – loganfsmyth

+0

どういう意味ですか?それは同じだろう。 'frank === undefined' =>' frank && getName(frank)=== undefined'! – MoeSattler

+0

申し訳ありませんが、私はそれをよりうまく表現できました。私の質問は、未定義を許可しないように 'getName'を変更できますか?あなたが示したことから、「Person」を取る良い理由はあまりありません。その署名があなたの問題の核心です。 'undefined 'が入ってくることがある場合は、' unName'で 'getName'を呼び出す前にチェックする方がいいでしょう。 – loganfsmyth

答えて

3

私の意見は、関数の引数から?を削除し、コールサイトに曖昧さ回避を残すことです。例えば

type Person = { name: string } 

function getName(person: Person): string { 
    return person.name 
} 

const maybeFrank: ?Person = Math.random() > 0.5 ? {name: 'Frank'} : undefined; 
const definitelyMaria: Person = {name: 'Maria'}; 

const frankName: ?string = maybeFrank && getName(maybeFrank) 
const mariaName: string = getName(definitelyMaria); 

そうでない場合、あなたは本当に、あなたが明示的に明示的なタイプ

type Person = { name: string } 

declare function getName(p: Person): string; 
declare function getName(p: void): void; 
function getName(p: ?Person): ?string { 
    if (!p) { 
    return undefined 
    } else { 
    return p.name 
    } 
} 

const frank: Person = { name: 'Frank' } 
const name: string = getName(frank) 
+0

2番目のソリューションは非常にうまくいった!もう1つの質問ですが、このような矢印機能を宣言できますか?例えば、 'function getName(p){}'の代わりに 'const getName = p => {}'があった場合 – MoeSattler

+0

私はそれについてはわかりません。 – loganfsmyth

関連する問題