TypeScript如何使用对象子字段作为另一个对象的键?
实现用foo对象的path字段作为新对象的键类型
要实现这个需求,核心是让TypeScript准确识别foo中path字段的具体字面量值,再以此作为新对象的键类型,具体步骤如下:
- 锁定
foo的字面量类型
默认情况下,TypeScript会把foo里的path字段推断为string类型,无法获取具体字符串值。需要用as const断言让TypeScript保留每个path的字面量类型:
const foo = { key1: { path: 'hello' }, key2: { path: 'world' }, key3: { path: 'smile' } } as const;
- 定义新对象的键类型
通过索引类型查询,提取所有path字段的联合类型,作为bar的键类型:
// 先提取所有path的联合类型(可选,也可以直接内联到类型定义中) type FooPathKeys = typeof foo[keyof typeof foo]['path']; const bar: { [Key in FooPathKeys]: number } = { hello: 1, world: 2, smile: 3 };
也可以直接把类型逻辑写在对象类型里,省略单独定义类型的步骤:
const bar: { [Key in typeof foo[keyof typeof foo]['path']]: number } = { hello: 1, world: 2, smile: 3 };
这样定义后,bar的键只能是hello、world、smile这三个值,TypeScript会对不符合的键名或缺失的键进行类型校验,保证类型安全。
内容的提问来源于stack exchange,提问作者damjuve
相关产品推荐
相关产品推荐

