首页 > 解决方案 > Typescript:为什么类型别名满足约束但相同的接口不满足?

问题描述

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

标签: typescript

解决方案


您遇到了一个已知问题,microsoft/TypeScript#15300,其中隐式索引签名被推断为类型别名而不是接口。这是类型别名和接口在类型分析中不同的少数几个地方之一。根据@RyanCavanaugh(Microsoft TypeScript 团队的开发负责人)的说法,这是设计使然:

只是为了填补人们的空白,这种行为目前是设计使然。因为接口可以通过额外的声明来扩充,但类型别名不能,所以推断类型别名的隐式索引签名比接口的隐式索引签名“更安全”(在那个上加上重引号)。但如果这似乎有意义的话,我们也会考虑为接口做这件事。[重点补充]

好的,它目前是设计使然,但 GitHub 问题的状态(截至 2019 年 4 月 23 日)是“建议”和“讨论中”。因此,如果您想看到这种变化,您可能想去那里并给出问题或描述您的用例(如果它特别引人注目)。

希望有帮助;祝你好运!


推荐阅读