为何boolean继承Record<"valueOf",unknown>却不继承Record<string,unknown>?
为什么
boolean不满足Record<string, unknown>的类型约束? 先看以下TypeScript类型检查示例:
type A = boolean extends Record<"valueOf", unknown> ? true : false // true // ^? type B = Record<"valueOf", unknown> extends Record<string, unknown> ? true : false // true // ^? type C = boolean extends Record<string, unknown> ? true : false // false // ^?
已知:
boolean符合Record<"valueOf", unknown>的类型约束Record<"valueOf", unknown>符合Record<string, unknown>的类型约束
核心原因:Record类型的键类型检查逻辑差异
TypeScript对Record<K, V>的约束检查,会根据键类型K的具体情况采用不同逻辑:
- 当K是具体字面量(比如
"valueOf"):只需要目标类型存在该字面量对应的属性即可。boolean对应的包装对象Boolean确实自带valueOf方法,所以TypeScript判定boolean满足Record<"valueOf", unknown>的约束。 - 当K是通用
string类型:要求目标类型是支持任意字符串索引的类型(即拥有[key: string]: V这样的索引签名)。而boolean及其包装对象只拥有固定的几个内置属性/方法,不可能覆盖所有字符串键,因此TypeScript判定boolean不满足Record<string, unknown>的约束。
另外,Record<"valueOf", unknown> extends Record<string, unknown>成立的原因是:字面量键"valueOf"是string的子类型,前者的键集合是后者的子集,所以更具体的Record可以被看作是更宽泛Record的子类型——但这个继承关系不能反向传递给boolean,因为boolean本身并不具备通用字符串索引的能力。
内容的提问来源于stack exchange,提问作者Acid Coder
相关产品推荐
相关产品推荐

