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

TypeScript泛型参数T的类型名能否作为接口或类的属性名使用?

问题解答

核心结论

TypeScript 无法直接实现「仅传入泛型参数T就自动将T的类型名作为属性名」的需求,因为 TypeScript 的类型信息仅存在于编译阶段,编译为 JavaScript 后所有类型都会被擦除,运行时无法获取Houses这类类型名的字符串值做动态属性映射。

可行替代方案

可以通过额外传入类型名的字面量参数,配合泛型约束实现类型安全、且符合你预期使用效果的能力,代码示例如下:

1. 定义泛型接口

// 泛型T为属性值的类型,泛型K为类型名字面量
export type ISample<T, K extends string> = {
  // 自动将传入的类型名转小写作为属性名
  [P in Lowercase<K>]: T
} & {
  otherProperties: any
}

2. 封装创建函数简化使用

// 示例的Houses类型
type Houses = {
  id: number
  address: string
}

function createSample<T, K extends string>(typeName: K, value: T, otherProps: any): ISample<T, K> {
  return {
    [typeName.toLowerCase()]: value,
    otherProperties: otherProps
  } as ISample<T, K>
}

3. 使用效果和预期完全一致

// 仅需传入一次类型名,既有完整类型提示,运行时也能正常访问
const data = createSample<Houses>('Houses', {id: 1, address: 'xx街道xx号'}, '其他属性值')
console.log(data.houses) // 编辑器会自动提示houses属性,类型为Houses

这个方案可以满足业务需求,所有属性都有完整的类型校验和智能提示,手动传入一次类型名字符串是TS类型擦除特性下的必要操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 02:54:08