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
相关产品推荐
相关产品推荐

