我试图理解类型脚本中的类型关系。 由以下两个表达式表示的类型的交集是什么:
{a:number}[] & {b:string}[]
那是
{a:number,b:string}[]
? 谢谢,
答案 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;
因此你是对的!