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)
?谢谢,
是的,对于类型定义中的运算符优先级,文档尚不清楚。但这很容易测试:
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
。
归档时间: |
|
查看次数: |
1027 次 |
最近记录: |