如何在TypeScript类型或接口中为键添加!前缀生成转义映射类型?
可以实现,你只需要使用TypeScript的键重映射+模板字面量特性就可以完成,正确的类型写法如下:
// 仅处理键为string类型的情况,符合你的业务场景 export type EscapeMappedT<T extends Record<string, any>> = { [K in keyof T as K | `!${string & K}`]: T[K] }
你可以直接测试效果:
// 输入的原始类型 type Input = { ToJSON: () => object; a: unknown; b: unknown; } // 转换后的类型,完全符合你的预期 type Output = EscapeMappedT<Input> // Output类型结构: // { // ToJSON: () => object; // "!ToJSON": () => object; // a: unknown; // "!a": unknown; // b: unknown; // "!b": unknown; // }
如果你的原始类型可能存在非string类型的键(比如number、symbol),可以用下面的兼容写法,非string键会原样保留不会添加!前缀:
export type EscapeMappedT<T extends Record<any, any>> = { [K in keyof T as K extends string ? K | `!${K}` : K]: T[K] }
以上写法要求TypeScript版本 >=4.1,该版本开始支持模板字面量类型和键重映射语法。
内容的提问来源于stack exchange,提问作者lmonninger
相关产品推荐
相关产品推荐

