我正在尝试理解类型脚本中的类型关系。 以下两个表达式表示的类型的交集是什么:
{a:number}[] & {b:string}[]
是吗
{a:number,b:string}[]
? 谢谢,
最佳答案
是的,对于类型定义中的运算符优先级,文档并不十分清楚。但它很容易测试:
type Z = { a: number }[] & { b: string }[];
let a: Z = [];
a = [{ a: 1, b: "q" }]; // Cannot assign because `b` does not exist in `{ a: number }`.
a = [{ a: 1 }]; // Cannot assign because `a` does not exist in `{ b: string }`.
a = [{b: "foo"}]; // Cannot assign because `b` does not exist in `{ a: number }`.
a = []; // Ok.
let x: { a: number, b: string }[] = a; // Cannot assign either.
上面表明它解析为 {a:number,b:string}[]
的假设是不正确的。我最初假设它会解析为 ({ a: number } | { b: string })[]
,但这也不正确。
交集表示“一个元素数组,其中每个元素满足类型{a:number}
,同时满足类型{b:string}
。因为 a
不属于第二种类型,b
不属于第一种类型,所以没有元素可以满足交集。所以你只能将空数组分配给类型化的变量与十字路口。
要获得您假设的结果,您需要一个不同的交集:
type Z2 = { a: number, b?: string }[] & { a?: number, b: string }[];
let a2: Z2 = [];
a2 = [{ a: 1, b: "q" }];
这正如您所期望的那样工作,因为交集中的第一个类型接受可选地具有 b
的元素,而第二个类型接受可选地具有 a
的元素。
关于javascript - 在 typescript 中输入交集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43157106/