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

无需运行时函数的TypeScript类型安全属性名获取方案

如何实现无运行时开销的TypeScript类型安全属性名转字符串?

你可以利用TypeScript的类型系统(结合satisfies运算符或类型注解)实现完全无运行时开销的类型安全属性名转换,替代会被编译到客户端的nameOf函数,具体方案如下:

方案一:使用satisfies运算符(TypeScript 4.9+)

satisfies能在不改变变量类型的前提下,检查值是否符合指定类型,完美适配你的需求:

class MyObject {
  propA: string;
  propB1: string;

  func() {
    // 合法:'propA'是MyObject的属性,编译通过
    const propAName = 'propA' satisfies keyof MyObject;
    // 编译错误:'propB'不是MyObject的属性,符合预期
    const propBName = 'propB' satisfies keyof MyObject;

    // 如果需要保留属性名的字面量类型,可添加`as const`
    const propALiteral = 'propA' satisfies keyof MyObject as const;
  }
}

这个方案完全在类型层面完成检查,不会生成任何运行时代码。

方案二:使用类型注解约束

如果不需要satisfies的灵活性,直接用类型注解也能达到相同效果:

// 定义复用类型,约束为目标类型的字符串属性键
type PropertyNameOf<T> = keyof T & string;

class MyObject {
  propA: string;
  propB1: string;

  func() {
    // 合法:类型注解确保'propA'是MyObject的属性
    const propAName: PropertyNameOf<MyObject> = 'propA';
    // 编译错误:'propB'不符合PropertyNameOf<MyObject>类型
    const propBName: PropertyNameOf<MyObject> = 'propB';
  }
}

补充说明

如果需要将属性名字面量转换为string类型(而非保留字面量),直接赋值即可——因为类型系统已经确保了值的合法性:

const propAName: string = 'propA' satisfies keyof MyObject;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 02:20:01