如果我有数组联合与联合数组,则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)
行不通吗?
答案 0 :(得分:3)
这当前不起作用。由于A[]
和B[]
的方法具有不同的签名,如果将它们放在一个联合中,则相应的方法将是原始签名的一个联合,因此不可调用。
here(可能在2019年1月的发行版)中描述的将来版本的打字稿中将放宽此限制。概述了所做的更改后,您的示例应该可以按预期运行,但是目前我尚未对此进行测试。
同时,最好的解决方案是使用类型断言:
(arr2 as (A | B)[]) .map(e => e.x);