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

如何在TypeScript中将对象字符串属性值用作类型属性名

TypeScript 将对象属性值映射为新类型属性名的实现方法

你给出的代码已经正确实现了需求,核心是借助TypeScript的映射类型重命名特性,通过as关键字把原对象的属性值转为新类型的属性名。

关键代码解析

  1. 原对象定义(可选优化)
    默认情况下TypeScript会把obj的属性值推断为string类型,若要精准获取字面量值作为新属性名,建议添加as const断言:
const obj = {
  prop1: "pp1",
  prop2: "pp2",
} as const;

此时typeof obj的类型会被锁定为{ readonly prop1: "pp1"; readonly prop2: "pp2"; },避免属性值被宽泛推断。

  1. 泛型类型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
  1. 验证预期效果
const tt: test<typeof obj> = {};
tt.pp1 = "123"; // 符合预期,可正常赋值
tt.pp2 = "123"; // 符合预期,可正常赋值
// tt.prop1 = "456"; // 报错,新类型属性名已替换为pp1/pp2

注意事项

  • 仅适用于属性值为字符串类型的对象,非字符串属性值会导致类型错误
  • 必须确保原对象的属性值是明确的字面量类型(通过as const),否则新类型的属性名会被推断为宽泛的string,失去精准性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 06:53:22