2017-01-16 3 views
1

Try flow link.限定された多型を改良することは可能ですか?ここで

は、私はそれを期待するように動作しません。簡単な有界多型の例です:

// @flow 

function thisBreaks<T: 'a' | 'b'>(x: T): T { 
    if (x === 'a') { 
    return 'a' 
    } else { 
    return 'b' 
    } 
} 

function thisWorks<T: 'a' | 'b'>(x: T): T { 
    return x 
} 

const a = 'a' 
const aPrime: 'a' = thisWorks(a) 
const b = 'b' 
const bPrime: 'b' = thisWorks(b) 

5:  return 'a'    
      ^string. This type is incompatible with the expected return type of 
3: function thisBreaks<T: 'a' | 'b'>(x: T): T { 
^some incompatible instantiation of `T` 

7:  return 'b'    
      ^string. This type is incompatible with the expected return type of 
3: function thisBreaks<T: 'a' | 'b'>(x: T): T { 
^some incompatible instantiation of `T` 

私は例えば以来、仕事をする最初の例を期待しているだろうx === 'a'小切手でT'a'の権利を得ることができますか?

+0

を返すことができますよりも、それは可能ではないですが、あなたが機能して何をしたいかを達成することができるかもしれません交差点。私はあなたの関数のための作業の種類を作成しました:(https://flow.org/try/#0PQKgBAAgZgNg9gdzCYAoVBjOA7AzgFzCjjgC4wAKCgD3IHIBDOgSjAF4A+MRl1MfgQIBklGvQBGLdlzqTmqNqOrSwytuu5MwAfk10wEluQbYAnvMw4CYcQwBO9LYuJwKPeVjyFbAL0PsiEjc5Sy8iBgBLGFxHfWcg2V4gA)[フローリンクをお試しください] – Andy

答えて

2

これは不可能であり、可能ではありません。

function test<T: number | string>(x: T): T { 
    if (typeof x === 'number') { 
    return 1; 
    } else { 
    return 'b' 
    } 
} 

test((5: 5)); 

機能がタイプ5の値を返すことになっているが、代わりに1を返します。ここではその理由を示す例です。

だからどうしますか?不明なタイプのTがあります。T <:string | numberTのサブタイプはstring | number)です。 xを精査した後、Tnumberのサブタイプです。 Tnumberであることを意味するものではありません。例のように5、または1 | 2 | 3とすることができます。 Tnumberのサブタイプであることがわかっていれば、Tという値を作成するには不十分です。そのためには、Tの下限を知る必要がありますが、それを知る方法はありません。

最後の質問は、どうしてあなたはどうやら明らかに安全であるのでしょうか?単純です:T <:'a'の場合は、'a'(またはemptyでもかまいませんが、実際問題ではありません)。 'a'の他のサブタイプはありません。だから、理論的には、フローはそれをサポートすることができますが、その非常に実用的ではありません:あなたはx'a'であることがわかっている場合、あなただけのx

+0

感謝を!ええ、私はhttps://github.com/facebook/flow/issues/3219へのあなたの応答を見ました。私は間違いなくそのような特定のタイプの意味について考えていませんでした。 –

+0

私の質問を動機づけた実際の問題はここにあります:http://stackoverflow.com/questions/41496896/typing-a-camel-caser-in-flow-variance-issues。正確な流れのタイプをラクダ化する素晴らしい方法はないと私は正しいのですか? –

+0

タイプTのものを生成する唯一の方法は、すでにタイプがTのものを取ることです。 – vkurchatkin

関連する問題