我遇到了这个奇怪的案例。我声明一个条件类型。对于相同的extends
约束,类型别名可以满足它,而结构相同的接口则不能。
我很迷茫,为什么会有所不同?检查playground。
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
答案 0 :(得分:3)
我认为您遇到了known issue,据此推断implicit index signatures是针对类型别名,而不是针对接口。这是在类型分析中类型别名和接口不同的少数几个地方之一。根据{{3}}(Microsoft TypeScript团队的开发负责人)的说法,这是@RyanCavanaugh
仅是为了填补人员缺席,这种行为目前是设计使然。由于可以通过其他声明来增强接口,但不能使用类型别名来进行扩展,因此推断类型别名的隐式索引签名比接口的隐式索引签名“更安全”(在该引用上使用大量引号)。 但是,如果看起来合理,我们也将考虑在接口上使用它。 [重点已加]
好的,目前是设计上的 ,但是GitHub问题的状态(截至2019-04-23)为“建议”和“讨论中”。因此,如果您希望对此进行更改,则可能需要by design:并给出一个问题或描述您的用例(如果它特别引人注目)。
希望有所帮助;祝你好运!