打字稿中的交集

Dav*_*vid 1 javascript functional-programming typescript

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

{a:number}[] & {b:string}[]
Run Code Online (Sandbox Code Playgroud)

就是它

{a:number,b:string}[]
Run Code Online (Sandbox Code Playgroud)

?谢谢,

Lou*_*uis 5

是的,对于类型定义中的运算符优先级,文档尚不清楚。但这很容易测试:

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.
Run Code Online (Sandbox Code Playgroud)

上面显示了它解析为的假设{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" }];
Run Code Online (Sandbox Code Playgroud)

这可以按您预期的那样工作,因为相交中b的第一个类型接受可选具有的元素,第二个类型接受可选具有的元素a