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

hac*_*ape 10 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
Run Code Online (Sandbox Code Playgroud)

jca*_*alz 11

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

只是为了让人们参与进来,这种行为目前是有意为之。由于接口可以通过附加声明进行扩充,但类型别名不能,因此推断类型别名的隐式索引签名比为接口推断隐式索引签名“更安全”(在那个上面加引号)。但如果这似乎有意义,我们也会考虑为接口做这件事。[强调]

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

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