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
相关产品推荐
相关产品推荐

