TypeScript中等价类型为何出现不同keyof推导结果?
TypeScript中等价类型keyof结果显示差异问题解析
你遇到的问题是:ObjType1和ObjType2互相extends结果都为true,但keyof ObjType2得到明确的联合类型"a" | "b",而keyof ObjType1却显示为keyof ObjType1,没有展开成联合类型。
代码示例
const obj = { a: 1, b: 1, }; type ObjType1 = { a: number; b: number; } type ObjType2 = typeof obj; type R1 = ObjType1 extends ObjType2 ? true : false; // true type R2 = ObjType2 extends ObjType1 ? true : false; // true type Result1 = keyof ObjType2; // type Result1 = "a" | "b" type Result2 = keyof ObjType1; // type Result2 = keyof ObjType1
原因解析
这只是TypeScript的类型显示策略差异,并非两个类型本身存在实质区别:
ObjType2是通过typeof从具体值推导而来的类型,编译器会将它的键视为明确的字面量集合,因此keyof结果会直接展开为联合类型。ObjType1是手动定义的对象类型字面量,编译器默认会保留它的原始定义名称作为显示形式,不会自动展开keyof的结果。但实际上keyof ObjType1的底层类型就是"a" | "b",你可以通过工具类型强制展开查看:type UnwrapKeyof<T> = keyof T extends infer K ? K : never; type Result2Unwrapped = UnwrapKeyof<ObjType1>; // "a" | "b"
验证类型等价性
你可以通过以下代码验证Result1和Result2是完全等价的:
type TestEqual = Result1 extends Result2 ? Result2 extends Result1 ? true : false : false; // true
内容的提问来源于stack exchange,提问作者Eugene Karataev
相关产品推荐
相关产品推荐

