如何在TypeScript中将对象字符串属性值用作类型属性名
TypeScript 将对象属性值映射为新类型属性名的实现方法
你给出的代码已经正确实现了需求,核心是借助TypeScript的映射类型重命名特性,通过as关键字把原对象的属性值转为新类型的属性名。
关键代码解析
- 原对象定义(可选优化)
默认情况下TypeScript会把obj的属性值推断为string类型,若要精准获取字面量值作为新属性名,建议添加as const断言:
const obj = { prop1: "pp1", prop2: "pp2", } as const;
此时typeof obj的类型会被锁定为{ readonly prop1: "pp1"; readonly prop2: "pp2"; },避免属性值被宽泛推断。
- 泛型类型
test<T>核心逻辑
type test<T> = { [Property in keyof T as `${T[Property] & string}`]: string; };
[Property in keyof T]:遍历传入类型T的所有属性名as${T[Property] & string}``:将原属性的取值转换为字符串字面量,作为新类型的属性名;& string用于确保类型为字符串,避免非字符串值引发错误: string:指定新类型中每个属性的类型为string
- 验证预期效果
const tt: test<typeof obj> = {}; tt.pp1 = "123"; // 符合预期,可正常赋值 tt.pp2 = "123"; // 符合预期,可正常赋值 // tt.prop1 = "456"; // 报错,新类型属性名已替换为pp1/pp2
注意事项
- 仅适用于属性值为字符串类型的对象,非字符串属性值会导致类型错误
- 必须确保原对象的属性值是明确的字面量类型(通过
as const),否则新类型的属性名会被推断为宽泛的string,失去精准性
内容的提问来源于stack exchange,提问作者NoobMaster
相关产品推荐
相关产品推荐

