打字稿:为什么类型别名满足约束但同一个接口不满足?

时间:2019-04-23 15:22:03

标签: typescript

我遇到了这个奇怪的案例。我声明一个条件类型。对于相同的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

1 个答案:

答案 0 :(得分:3)

我认为您遇到了known issue,据此推断implicit index signatures是针对类型别名,而不是针对接口。这是在类型分析中类型别名和接口不同的少数几个地方之一。根据{{​​3}}(Microsoft TypeScript团队的开发负责人)的说法,这是@RyanCavanaugh

  

仅是为了填补人员缺席,这种行为目前是设计使然。由于可以通过其他声明来增强接口,但不能使用类型别名来进行扩展,因此推断类型别名的隐式索引签名比接口的隐式索引签名“更安全”(在该引用上使用大量引号)。 但是,如果看起来合理,我们也将考虑在接口上使用它。 [重点已加]

好的,目前是设计上的 ,但是GitHub问题的状态(截至2019-04-23)为“建议”和“讨论中”。因此,如果您希望对此进行更改,则可能需要by design:并给出一个问题或描述您的用例(如果它特别引人注目)。

希望有所帮助;祝你好运!