Javascript Typescript:如何映射联合数组类型?

Javascript Typescript:如何映射联合数组类型?,javascript,typescript,Javascript,Typescript,我的结构如下: 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]),cal

我的结构如下:

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…”没有兼容的调用签名


如何映射测试变量?

为4.2编辑

map
现在已成为可调用的,但您仍然需要在其参数上添加显式类型注释,以使其按预期工作(类型参数不是上下文类型)

这种情况可能会在将来的版本中得到改善,从而使此答案基本上过时(请参阅将正确合成参数的上下文类型)

4.2之前的原始答案

问题是,对于联合类型,作为函数的成员也将被类型化为联合类型,因此
map
的类型将是
((callbackfn:(值:Test1,索引:number,数组:Test1[])=>U,thisArg?:any=>U[])((callbackfn:(值:Test2,索引:number,数组:Test2[])=>U)
就typescript而言,它是不可调用的

您可以声明
Test1
Test2

let test: (Test1 | Test2)[] = [];
test.map(obj => {}); 
或者,您可以在调用时使用类型断言:

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

数组是否表示数组可能由这两种类型的组合填充?因此它可能是
[Test1,Test1,Test2,Test1,Test2,…]
。其中
(Test1 | Test2)[
Test1[]| Test2[]
将是全部
Test1
或全部
Test2
?@mtpultz
数组
(Test1 | Test2)[
相同,表示
[Test1,Test1,Test2,Test1,Test2,…]
Test1[]| Test2[]
表示所有项目都将是
Test1
或所有
Test2
@RanLottem,因为原始post TS已更改了允许此类调用的方式。由于泛型类型参数,映射仍然不可调用。每个项目都没有泛型类型参数,因此TS可以创建可调用的合并版本。这是相关PR:请参阅在TS3.3中,以及解释为什么
map()
仍然没有被合并到TS4.3中的Workbook最终解决了这个问题(至少如果您使用
--noImplicitAny
,这很奇怪)
let test: Test1[] | Test2[] = [];
(test as Array<Test1|Test2>).map(o=> {});