下記のようなObj
型を定義します。
ts
1type Obj = { a: number; b: string } & { 2 [x: string]: Obj[] | Obj[keyof Obj] 3};
また、下記のような構造の型および変数を定義します。
ts
1declare const test: Outer[]; 2 3type Outer = { 4 a: number; 5 b: string; 6 xxx: Array<Inner>; 7}; 8 9type Inner = { 10 a: number; 11 b: string; 12 yyy: Array<Innermost>; 13}; 14 15type Innermost = { 16 a: number; 17 b: string; 18};
このとき、下記testFn()
への引数の割当は問題なく行えます。
ts
1declare function testFn(arg: Obj[]): void; 2testFn(test); // OK
さて、ここで、上記Outer
Inner
Innermost
と同じ構造となるような型をinterfaceで設計します。
ts
1declare const testInterface: OuterInterface[]; 2 3interface OuterInterface { 4 a: number; 5 b: string; 6 xxx: Array<InnerInterface>; 7} 8 9interface InnerInterface { 10 a: number; 11 b: string; 12 yyy: Array<InnermostInterface>; 13} 14 15interface InnermostInterface { 16 a: number; 17 b: string; 18}
ところが、このtestInterface
はtestFn()
への割当が失敗してしまいます。
ts
1testFn(testInterface); // Index signature for type 'string' is missing in type 'OuterInterface'.
このようなtypeとinterfaceで割当可能性が異なる原因について、ご存じの方がいらっしゃればご教示いただけますと幸いです。
ちなみに、Outer
およびOuterInterface
は相互に割り当て可能になりそうです・・・
ts
1declare let outerArray: Outer[]; 2declare let outerInterfaceArray: OuterInterface[]; 3 4outerArray = outerInterfaceArray; // OK 5outerInterfaceArray = outerArray; // OK
あなたの回答
tips
プレビュー