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=> {});