1. ホーム
  2. typescript

[解決済み] ユニオン配列型にマッピングするには?

2023-05-09 13:42:07

質問

以下のような構造になっています。

interface Test1 {
    number: number;
}
interface Test2 extends Test1 {
    text: string;
}

let test: Test1[] | Test2[] = [];
test.map(obj => {}); // does not work

エラーが出ています。

型に呼び出し署名がない式は呼び出すことができません。タイプ '{ (this: [Test1, Test1, Test1, Test1, Test1], callbackfn: (this: void, value: Test1, index: nu...'は互換性のあるコールサインを持ちません。

どのようにしたら map をテスト変数の上に置くことができますか?

どのように解決するには?

4.2用に編集

map は呼び出せるようになりましたが、期待通りに動作させるためには、まだ引数に明示的な型注釈が必要です(型パラメータは文脈的に型付けされません)。

let test: Test1[] | Test2[] = [];
test.map((obj: Test1 | Test2) => {});

遊び場リンク

この状況は、将来のバージョンで改善される可能性が高く、この回答はほとんど時代遅れになっています ( PR を使えば、パラメータの文脈型が正しく合成されます)

4.2以前のオリジナルの回答

問題は、ユニオン型の場合、関数であるメンバもユニオン型として型付けされるため、ユニオン型である map(<U>(callbackfn: (value: Test1, index: number, array: Test1[]) => U, thisArg?: any) => U[]) | (<U>(callbackfn: (value: Test2, index: number, array: Test2[]) => U) これはtypescriptに関する限り、呼び出し可能ではありません。

の和集合の配列を宣言することもできます。 Test1Test2

let test: (Test1 | Test2)[] = [];
test.map(obj => {}); 

または、呼び出し時にタイプアサーションを使用することもできます。

let test: Test1[] | Test2[] = [];
(test as Array<Test1|Test2>).map(o=> {});