为什么TypeScript中type X = {} extends {[x:string]:number} ? true : false恒成立
TypeScript中空类型
{}可扩展字符串索引签名类型的原因 你给出的条件类型判定结果恒为true,和你提到的「{}是几乎所有类型的超类型」规则无关,该规则是用来解释任意类型 extends {}大多成立的场景,本次判定的核心是TS的索引签名校验逻辑与逻辑学的空真原则:
- 首先明确两类类型的约束定义
- 字符串索引签名类型
{[x:string]:number}的约束是:该类型下所有字符串类型属性的取值,都必须是number类型 - 空类型
{}的定义是:不包含任何自有字符串属性的对象类型
- 字符串索引签名类型
- 其次理解
extends的判定逻辑:TypeScript作为结构类型系统,A extends B成立的核心条件是:所有符合A类型的值,都完全满足B类型的所有约束,可以直接赋值给B类型的变量 - 最后是空真原则的应用:对于「所有成员都必须符合XX要求」的全称判断,如果当前类型没有对应的成员,这个判断天然成立,不存在任何违反约束的可能。空类型
{}没有任何字符串属性,自然完全满足索引签名的约束,因此判定结果为true
可以参考反向案例理解规则:
// 结果为false,因为存在a属性为string类型,违反了索引签名的取值要求 type Y = {a: string} extends {[x:string]:number} ? true : false
内容的提问来源于stack exchange,提问作者Majid Majed
相关产品推荐
相关产品推荐

