在打字稿中输入交集

时间:2017-04-01 12:51:56

标签: javascript typescript functional-programming

我试图理解类型脚本中的类型关系。 由以下两个表达式表示的类型的交集是什么:

{a:number}[] & {b:string}[]

那是

{a:number,b:string}[]

? 谢谢,

2 个答案:

答案 0 :(得分:2)

是的,关于类型定义中的运算符优先级,文档并不清楚。但测试相当容易:

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的元素。

答案 1 :(得分:-2)

type T1={a:number}[];
type T2={b:string}[];
type intersection =T1&T2;
let z:intersection;
let z2=[{a:1,b:'2'}];
z=z2;

因此你是对的!