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

TypeScript如何保留对象类型同时提取指定键定义新类型?

解决方案

当然可以实现,核心是既要让myObject满足{ [id: string]: string }的类型约束,又要让TypeScript保留它的具体键名信息——直接给变量标注索引类型会丢失具体键的字面量类型,所以得换方式约束。

这里有两种常用方法:

方法一:用satisfies关键字(TypeScript 4.9+支持)

通过satisfies检查对象是否符合索引类型,同时保留具体键名的字面量信息:

// 定义对象时用satisfies约束类型,同时保留键名
const myObject = {
  one: 'foo',
  two: 'bar'
} as const satisfies { [id: string]: string };

// 基于对象的键生成目标类型
type MyType = {
  [K in keyof typeof myObject]: { bar: string };
};

方法二:交叉类型兼容低版本TS

如果你的TS版本低于4.9,用交叉类型同时保留索引约束和具体键类型:

// 用交叉类型让对象既符合索引类型,又保留具体键
const myObject = {
  one: 'foo',
  two: 'bar'
} as { [id: string]: string } & { one: string; two: string };

// 生成目标类型
type MyType = {
  [K in keyof typeof myObject]: { bar: string };
};

两种方法最终生成的MyType都会是:

type MyType = {
  one: { bar: string };
  two: { bar: string };
};

不会允许任意字符串键,完全符合预期。

内容的提问来源于stack exchange,提问作者fortysixandtwo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 20:09:30