javascript - 在 typescript 中输入交集

标签 javascript typescript functional-programming

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

{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/

相关文章:

javascript - "[+"在 Javascript 或 Angular 中的含义

javascript - 我的 JavaScript 函数没有使用我需要的变量之一

javascript - 渐变不适用于 iOS 设备

javascript - 我怎样才能向左滑动切换?

javascript - 如何在 Angular 中构建延迟加载侧边栏?

angular - 带 Angular 路由器的 RXJS - 'mergeMap' 不是函数

haskell - Haskell 类型类的基础知识和 "could not deduce (~) from the context (~)"错误

haskell - 类似 curl 的单子(monad)变压器?

haskell - 的 是什么意思? Haskell 中的记录语法如何做?

javascript - 错误 : Cannot find module 'socket.io-client/dist/socket.io.min.js'