打字稿:如何映射联合数组类型?

Mur*_*göz 17 javascript typescript

我有以下结构:

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

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

我收到错误:

无法调用类型缺少调用签名的表达式.输入'{(this:[Test1,Test1,Test1,Test1,Test1],callbackfn :( this:void,value:Test1,index:nu ...'没有兼容的呼叫签名

我怎样才能map超过测试变量?

Tit*_*mir 28

问题是对于union类型,作为函数的成员也将被输入为union类型,因此就typescript而言,其类型map(<U>(callbackfn: (value: Test1, index: number, array: Test1[]) => U, thisArg?: any) => U[]) | (<U>(callbackfn: (value: Test2, index: number, array: Test2[]) => U)不可调用.

您可以宣告联盟的数组Test1Test2

let test: (Test1 | Test2)[] = [];
test.map(obj => {}); 
Run Code Online (Sandbox Code Playgroud)

或者,您可以在拨打电话时使用类型断言:

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

  • @mtpultz `Array&lt;Test1|Test2&gt;` 和 `(Test1 | Test2)[]` 相同,表示 `[Test1, Test1, Test2, Test1, Test2, ...]`。`测试1[] | Test2[]` 表示所有项目都将是 `Test1` 或全部为 `Test2` (4认同)
  • @RanLottem 自从最初的帖子 TS 改变了它允许此类调用的方式。由于泛型类型参数,Map 仍然不可调用。每个都没有泛型类型参数,因此 TS 可以创建可调用的合并版本。这是相关公关:https://github.com/Microsoft/TypeScript/pull/29011 (4认同)
  • `Array&lt;Test1|Test2&gt;` 是否表示数组可能被两种类型的组合填充?所以它可能是`[Test1, Test1, Test2, Test1, Test2, ...]`。其中`(Test1 | Test2)[]` 或`Test1[] | Test2[]` 会全部是`Test1` 还是全部是`Test2`? (3认同)
  • 请参阅 TS3 中的[调用联合类型的改进行为](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-3.html#improved-behavior-for-calling-union-types) .3 以及 [caveats](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-3.html#caveats) 解释了为什么 `map()` 仍然不能工作 (3认同)