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

TypeScript中如何将属性类型设为类型名的可文本化表示?

首先核心结论:TypeScript 的类型是编译期擦除的结构化类型,没有原生能力直接从传入的 class/interface 类型本身提取其定义的名称字符串,你需要手动传入类型名称的字符串字面量来实现需求。

需求1:生成属性名为类型名的对象类型

实现代码:

// T 是类型名字面量,V 是属性值类型,可自行替换默认值
type DynamicPropertyName<T extends string, V = any> = {
  [K in T]: V
}

// 使用示例
type WithPropFoo = DynamicPropertyName<'Foo'> // 类型为 { Foo: any }
type WithPropBar = DynamicPropertyName<'Bar', number> // 类型为 { Bar: number }

需求2:生成type字段为类型名字面量的对象类型

实现代码:

type DynamicPropertyName<T extends string> = {
  type: T
}

// 使用示例
type WithPropFoo = DynamicPropertyName<'Foo'> // 类型为 { type: 'Foo' }
type WithPropBar = DynamicPropertyName<'Bar'> // 类型为 { type: 'Bar' }

// 校验符合预期
const foo1: WithPropFoo = { type: 'Foo' }   // 校验通过
const foo2: WithPropFoo = { type: 'Hello' } // 类型不匹配,校验报错
const bar1: WithPropBar = { type: 'Bar' }   // 校验通过
const bar2: WithPropBar = { type: 'Hello' } // 类型不匹配,校验报错

如果是配合 class 使用,你也可以直接从 class 构造函数的 name 属性取值来减少重复定义,但需要额外声明 name 为字面量类型:

class Foo {
  static readonly name: 'Foo' = 'Foo'
}
type WithPropFoo = DynamicPropertyName<typeof Foo.name>

注意 interface 没有运行时实体,无法通过类似方式获取名称,只能手动传入字符串字面量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 23:12:00