联合的TypeScript数组与数组的联合

时间:2019-01-03 12:46:47

标签: typescript union-types

如果我有数组联合与联合数组,则TypeScript编译器的行为会有所不同:

type A = { x: string };
type B = { x: string, y: number };

const arr1: (A | B)[] = [];
arr1.find(e => e.x === ""); // OK
arr1.map(e => e.x); // OK

const arr2: A[] | B[] = [];
arr2.find(e => e.x === ""); // OK
arr2.map(e => e.x); // Error: Cannot invoke an expression whose type lacks a call signature.

arr2.map(e => e.x)行不通吗?

1 个答案:

答案 0 :(得分:3)

这当前不起作用。由于A[]B[]的方法具有不同的签名,如果将它们放在一个联合中,则相应的方法将是原始签名的一个联合,因此不可调用。

here(可能在2019年1月的发行版)中描述的将来版本的打字稿中将放宽此限制。概述了所做的更改后,您的示例应该可以按预期运行,但是目前我尚未对此进行测试。

同时,最好的解决方案是使用类型断言:

(arr2 as (A | B)[]) .map(e => e.x);