typescript - 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
解决方案
您遇到了一个已知问题,microsoft/TypeScript#15300,其中隐式索引签名被推断为类型别名而不是接口。这是类型别名和接口在类型分析中不同的少数几个地方之一。根据@RyanCavanaugh(Microsoft TypeScript 团队的开发负责人)的说法,这是设计使然:
只是为了填补人们的空白,这种行为目前是设计使然。因为接口可以通过额外的声明来扩充,但类型别名不能,所以推断类型别名的隐式索引签名比接口的隐式索引签名“更安全”(在那个上加上重引号)。但如果这似乎有意义的话,我们也会考虑为接口做这件事。[重点补充]
好的,它目前是设计使然,但 GitHub 问题的状态(截至 2019 年 4 月 23 日)是“建议”和“讨论中”。因此,如果您想看到这种变化,您可能想去那里并给出问题或描述您的用例(如果它特别引人注目)。
希望有帮助;祝你好运!
推荐阅读
- c# - Linq 按日期范围分组
- typescript - lambdas 允许的额外属性,但函数不允许
- regex - 带有 unicode 字符的 Perl 正则表达式替换不起作用,我错过了什么?
- python - 有没有办法使用 openpyxl 在 Python 中删除或修改 xlsx (Excel) 图表?
- swift - 在扩展上声明泛型类型参数
- swift - 参照窗口添加菜单项
- css - 更改数据表过滤器下拉框的颜色
- python - 在 matplotlib 中创建带有自由 y 轴的箱形图的子图
- linux - aarch64 内核映像中的 text_offset 是什么,我如何知道内核入口点在哪里?
- arrays - 如何手动获取已使用过滤器将数据格式化为日期的 JSON 数组中的第一个元素项?