You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 01:52:11