gpt4 book ai didi

typescript - 为什么允许在 TypeScript 中将基元和对象相交?

转载 作者:行者123 更新时间:2023-12-05 09:35:23 26 4
gpt4 key购买 nike

为什么以下不产生 never

type test = string & {name: string}

是因为原始类型不是名义上的吗?

最佳答案

编译器并不总是积极地将不可能的类型减少到never

通常这是不值得的,尤其是当它涉及检查冲突的属性和子属性时;见this comment在 microsoft/TypeScript#42324 上,举一个如此积极的减少如何会降低性能的例子:“属性解析是延迟的;如果永远不需要计算某个类型的属性,那么它根本就不需要计算”

其他时候,这些不可能的类型本身实际上很有用。对象与基本类型相交的具体情况实际上用在称为 "branded primitives" 的技术中。 .这允许您为编译器可以相互区分的基元创建“标称”类型。 stringstring,但 string & {__brand: "A"} 不是 string & {__brand: "B"}.不要介意在运行时实际的 string 不会有 __brand 属性;我们可以通过 type assertion 欺骗编译器并假装我们有两个不同的 string 类型,它们不能相互赋值。这是对结构类型系统的一个小滥用,它允许我们模拟名义类型(参见 microsoft/TypeScript#202)。

如果我们坚持认为 string & {__brand: "A"} 应该减少到 never 因为没有值可以匹配它,我们将失去能力创建这样的品牌基元。这在某些时候可能是可以接受的,但它们在现实世界的代码(包括 compiler itself )中使用得足够多,因此这样做将是一个重大的改变。

关于typescript - 为什么允许在 TypeScript 中将基元和对象相交?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65908355/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com