如何使用TypeScript模板字面量类型为Typeorm别名原始查询结果生成强类型
解决方案
你可以使用TypeScript 4.1以上版本支持的**键重映射(Key Remapping)**语法实现需求,核心思路是遍历User的原始键,仅在生成最终键名时拼接前缀,值类型直接用原始键索引User即可:
type RawUser = { [K in keyof User as `u_${K}`]: User[K] }
如果需要适配不同前缀的场景,可以封装成通用的工具类型:
// 通用前缀添加工具类型 type AddPrefix<T, Prefix extends string> = { [K in keyof T as `${Prefix}${K}`]: T[K] } // 传入User和前缀u_生成目标类型 type RawUser = AddPrefix<User, 'u_'>
最终生成的RawUser类型等价于:
interface RawUser { u_id: string; u_name: string; u_age: number; }
完全匹配TypeORM原始查询返回的带前缀的结构。
原写法错误原因
你之前的写法遍历的是已经拼接完成的u_${keyof User}联合类型,此时遍历出的K是'u_id' | 'u_name' | 'u_age',自然无法作为User类型的合法索引(User的键类型是'id' | 'name' | 'age')。
内容的提问来源于stack exchange,提问作者stewartmcgown
相关产品推荐
相关产品推荐

