import { A } from "https://example.com/type.d.ts";
type B = A | A
如果您将鼠标悬停B
在 TS Playground 和 VS Code 上,它将显示为A
casetype B = A
和any
case type B = A | A
。不管 A 是否已知,我希望它们应该是一致的。为什么事实并非如此?
import { A } from "https://example.com/type.d.ts";
type B = A | A
如果您将鼠标悬停B
在 TS Playground 和 VS Code 上,它将显示为A
casetype B = A
和any
case type B = A | A
。不管 A 是否已知,我希望它们应该是一致的。为什么事实并非如此?
根据microsoft/TypeScript#54630,特别是 TS 团队开发负责人的评论:
当您导入找不到的内容时,您会收到编译器错误:
对它的任何引用都将显示为 TypeScript 想要显示的任何内容。它通常倾向于显示为类型
any
,因为这就解释了为什么你
any
有时会看到.至于为什么它显示
A
而不是any
当你从到
没有记录在案的稳定规则来显示此类类型。假设
A
有时显示为any
,那么编译器实际上有特权决定要显示其中哪一个。即使A
没有错误,你仍然会有这样的二分法:那里有 type
D
,它显然是的别名{a: string}
。的一些用法D
被简化为{a: string}
,而另一些则保留为D
。这些差异只是类型向用户显示的方式,不应影响类型的实际标识。没有受支持的官方机制可以让开发人员在显示类型时告诉编译器她希望看到哪种形式。有各种开放功能请求,例如microsoft/TypeScript#28508、microsoft/TypeScript#31940和microsoft/TypeScript#45954,如果它们被实现,这可能会改变这一点,但目前它还不是语言的一部分。编译器使用启发式方法来确定要显示的类型;这些启发式方法在广泛的用例中表现得足够好,但它们必然无法同时满足每个人的需求。对于每个想要
D
显示为 的人{a: string}
,都有一个平等且相反的人希望将其显示为D
,并且他们都有非常重要的理由这样做,并且都认为他们的方式会使事情“一致” 。更多的开发人员控制固然很好,但如果没有这些,你就只能得到你所得到的。所以:我不能轻易地说出为什么你会看到
any
forA | A
但A
forA
,而不单步执行 TypeScript 编译器代码,也可能找到记录负责部分的拉取请求。但即使我这样做了,也不会特别有启发性,而且它很容易在 TypeScript 的未来版本中改变。只要两种类型相同,从某种意义上说,就完全由编译器决定显示哪一种类型以及何时显示。Playground 代码链接