2017-09-15 14 views
2

Scott Wlaschinに基づくexamples in F# Typescriptを使用して機能ドメインモデルを設計しようとしています。なぜこれはTypescriptとFlowで有効ですか?

しかし、オプションのパラメータでより厳密に定義された型を持たせるために、私は、typescriptが期待したプロパティを検証していないことに気付きました。このタイプのために例えば

、:

type ObjectOne = { 
    propertyOfOneMustBeNumber: number 
} 
type ObjectTwo = { 
    propertyOfTwoMustBeNumber: number 
} 

type Options = ObjectOne | ObjectTwo 

私は次の使用例があります。

// valid 
const test1: Options = { 
    propertyOfOneMustBeNumber: 1, 
    propertyOfTwoMustBeNumber: 2 
} 

// invalid: 
// Object literal may only specify known properties, 
// and 'unrecognized_property' does not exist in type 'Options'. 
const test2: Options = { 
    propertyOfOneMustBeNumber: 1, 
    unrecognized_property: 'string' 
} 

// valid 
const test3: Options = { 
    propertyOfOneMustBeNumber: 1, 
    propertyOfTwoMustBeNumber: 'string' 
} 

test2変数のエラーが発生した理由を私は理解し、 けどなぜpropertyOfTwoMustBeNumberがstrであっても、 の変数test3のエラーはありません数字ではありませんか?

これはフロータイプシステムでも有効です。

+1

重複:https://stackoverflow.com/questions/31816061/why-am-i-getting-an-error-object-literal-may-only-specify-known-properties? – Webbies

+1

合計タイプが何であるか誤解しています。それはどちらか、あるいは両方ではありません。 'Option'(時には' Maybe 'と呼ばれることもある)は 'Just something'または' null'であり、両方ではありません。 –

+0

「[オブジェクトリテラルは既知のプロパティのみを指定することができる」というエラーが表示されるのはなぜですか?](https://stackoverflow.com/questions/31816061/why-am-i-getting-an-error-object-literal -may-only-specified-known-properties) –

答えて

1

両方のタイプのシステムによれば、test3ObjectOneの有効なサブタイプです。あなたが識別プロパティを使用することができ、いずれのタイプのシステムでは

flowtypeで
type ObjectOne = { 
    kind: 'one'; 
    propertyOfOneMustBeNumber: number 
} 
type ObjectTwo = { 
    kind: 'two'; 
    propertyOfTwoMustBeNumber: number 
} 

type Options = ObjectOne | ObjectTwo 

// error 
const test2: Options = { 
    kind: 'one', 
    propertyOfOneMustBeNumber: 1, 
    unrecognized_property: 'string' 
} 

// error 
const test3: Options = { 
    kind: 'two', 
    propertyOfOneMustBeNumber: 1, 
    propertyOfTwoMustBeNumber: 'string' 
} 

あなたはまた、既存のどのような種類の余分な性質を防ぐことができます正確なタイプ、使用することができます。

type ObjectOne = {| 
    propertyOfOneMustBeNumber: number 
|} 

をTypeScriptでは、オプションのneverプロパティを使用して、対応するタイプの既存のプロパティを除外できます。

type ObjectOne = { 
    propertyOfOneMustBeNumber: number; 
    propertyOfTwoMustBeNumber?: never; 
} 
type ObjectTwo = { 
    propertyOfOneMustBeNumber?: never; 
    propertyOfTwoMustBeNumber: number; 
} 
+0

私は必ずしも同意していないわけではありませんが(TypeScriptは分かりません)、 'Option'はF#の' Maybe'のバージョンです。 'Just a'または' Nothing'のいずれかです。私はOPが参照されているビデオを理解しているかどうかはわかりません。 –

関連する問題