我遇到了这个奇怪的案例。我声明了一个条件类型。对于相同的extends约束,类型别名满足它,而结构相同的接口则不满足。
我很失落,为什么不同?检查操场。
interface Constraint {
[key: string]: string | number | boolean
}
type ATypeAlias = {
str: string
num: number
bool: boolean
}
interface SameInterface {
str: string
num: number
bool: boolean
}
type expectToBeTrue = ATypeAlias extends Constraint ? true : false
// Wat???
type butWhyAmIFalse = SameInterface extends Constraint ? true : false
Run Code Online (Sandbox Code Playgroud)
jca*_*alz 11
您遇到了一个已知问题microsoft/TypeScript#15300,其中隐式索引签名是为类型别名推断的,而不是为接口推断的。这是类型别名和接口在类型分析中不同的少数几个地方之一。根据@RyanCavanaugh(微软 TypeScript 团队的开发负责人)的说法,这是设计使然:
只是为了让人们参与进来,这种行为目前是有意为之。由于接口可以通过附加声明进行扩充,但类型别名不能,因此推断类型别名的隐式索引签名比为接口推断隐式索引签名“更安全”(在那个上面加引号)。但如果这似乎有意义,我们也会考虑为接口做这件事。[强调]
好的,它目前是设计使然,但 GitHub 问题的状态(截至 2019 年 4 月 23 日)是“建议”和“讨论中”。因此,如果您想看到这种变化,您可能想要去那里并给出问题或描述您的用例(如果它特别引人注目)。
希望有所帮助;祝你好运!
| 归档时间: |
|
| 查看次数: |
167 次 |
| 最近记录: |