type someType = {
keyOne: string,
keyTwo: string,
};
type someOtherType = {
keyOne: string,
keyTwo: string,
keyThree: string,
};
これらのタイプは両方ともkeyOne
とkeyTwo
を含むオブジェクトであり、唯一の違いは後者ですextends前者にkeyThree
の追加キーがあります。
複製されたコードを書くのではなく、someOtherType
を拡張することでsomeType
フロータイプを構築することは可能ですか?私の考えでは、ES6オブジェクトのレスト/スプレッドが思い浮かびますが、Flowでこのようなことをどのように達成するかはわかりません。
ありがとう!
探しているのは 交差タイプ です。ドキュメントによると:
交差タイプでは、値がすべての入力タイプである必要があります。
構文:交差点:<タイプ1>&<タイプ2> ...&<タイプn>
交差タイプは、既存のタイプを拡張し、タイプ要件を追加することを目的としています。
type someType = {
keyOne: string,
keyTwo: string
}
type someOtherType = someType & {
keyThree: string
}
const shouldBeOk: someOtherType = {
keyOne: 'biz',
keyTwo: 'buzz',
keyThree: 'baz',
}
const shouldError: someOtherType = {
keyOne: 123,
keyTwo: 'hello',
keyThree: 'world',
}
// flow error:
16: const shouldError: someOtherType = {
^ object literal. This type is incompatible with
8: type someOtherType = someType & {
^ object type
交差タイプの論理的な反対は、 結合タイプ です。ドキュメントによると:
ユニオン型では、値が入力型の1つである必要があります。
構文:Union:<タイプ1> | <タイプ2> ... | <タイプn>
例として。ユニオン型を使用して、列挙型を作成できます。
type fooBarBazType = 'foo' | 'bar' | 'baz';
const shouldBeOk: fooBarBazType = 'bar';
const shouldError: fooBarBazType = 'buzz';
4: const shouldError: fooBarBazType = 'buzz';
^ string. This type is incompatible with
4: const shouldError: fooBarBazType = 'buzz';
^ string enum
申し訳ありませんが、受け入れられた答えは間違っており、完全一致を使用しなかったという理由だけで機能しています。
10:const shouldBeOk:someOtherType = {
^プロパティshouldBeOk
がオブジェクトタイプ 1 にないため、オブジェクトリテラル 2 に存在するため、オブジェクトリテラルをkeyOne
に割り当てることができません。参照:6:タイプsomeOtherType = someType&{|
^ 1 10:const shouldBeOk:someOtherType = {
^ 2
それを行う正しい方法は、spread
操作を使用することです。
type someOtherType = {|
...someType,
keyThree: string
|}