为什么以下没有产生never?
type test = string & {name: string}
Run Code Online (Sandbox Code Playgroud)
是因为原始类型不是名义类型的吗?
编译器并不总是积极地将不可能的类型减少为never.
通常这是不值得的,特别是如果它涉及检查冲突的属性和子属性;请参阅microsoft/TypeScript#42324 上的评论,了解这种激进的减少如何影响性能的示例:“属性解析被推迟;如果类型的属性永远不需要计算,那么它根本就不需要。”
其他时候,这些不可能的类型本身实际上是有用的。对象与基元类型相交的具体情况实际上用在称为“品牌基元”的技术中。这允许您为原语创建“标称”类型,编译器可以将这些类型相互区分。Astring是 a string,但astring & {__brand: "A"}不是astring & {__brand: "B"}。没关系,在运行时,实际对象string不会有__brand属性;我们可以通过类型断言对编译器撒谎,假装我们有两种string不能相互分配的不同类型。这是对结构类型系统的一个小滥用,它允许我们模拟名义类型(请参阅microsoft/TypeScript#202)。
如果我们坚持认为string & {__brand: "A"}应该简化为never因为没有值可以匹配它,我们将失去创建此类品牌原语的能力。这在某些时候可能是可以接受的,但它们在现实世界的代码(包括编译器本身)中使用得足够多,因此这样做将是一个重大改变。
| 归档时间: |
|
| 查看次数: |
847 次 |
| 最近记录: |