TypeScript对象映射器实现:如何创建可被TypeScript识别返回类型的对象映射工具
实现类型安全的对象属性生成器
要实现你需要的generator函数,核心是利用TypeScript的泛型和映射类型来精准描述输入输出的类型关系,同时用闭包保留原属性的值。话不多说,直接上完整实现:
function generator<T extends object>(obj: T): { [K in keyof T]: () => T[K] } { // 创建空对象作为返回值,先做类型断言避免TS报错 const result = {} as { [K in keyof T]: () => T[K] }; // 遍历原对象的每个属性 for (const key in obj) { if (obj.hasOwnProperty(key)) { // 用闭包捕获当前属性的值,确保每个函数返回正确的原属性值 result[key] = () => obj[key]; } } return result; }
为什么这样做?
- 泛型
<T extends object>:让TypeScript捕获输入对象的具体类型,这样后续的映射类型能基于这个类型生成对应的函数类型。 - 映射类型
{ [K in keyof T]: () => T[K] }:遍历输入类型T的所有键K,把每个属性的类型从T[K]转换成返回该类型的无参函数() => T[K],完美匹配你需要的ExpectedObject结构。 - 闭包捕获值:在循环中为每个属性创建函数时,直接引用
obj[key]即可,TS/ES6+会自动帮我们处理值的捕获,避免循环变量引用问题。
测试你的示例场景
用你给的例子验证一下:
type ExampleObject = { text: string; number: number; }; const object: ExampleObject = { text: 'asd', number: 1 }; const object2 = generator(object); // 此时TS会自动推断object2的类型为: // { // text: () => string; // number: () => number; // } // 调用函数也完全符合预期 object2.text(); // 返回 'asd' object2.number(); // 返回 1
拓展:处理嵌套对象(可选)
如果后续需要支持嵌套对象(原对象的子对象也转换成函数结构),只需要修改成递归类型即可:
type GeneratorResult<T> = T extends object ? { [K in keyof T]: () => GeneratorResult<T[K]> } : T; function generator<T extends object>(obj: T): { [K in keyof T]: () => GeneratorResult<T[K]> } { const result = {} as any; for (const key in obj) { if (obj.hasOwnProperty(key)) { const value = obj[key]; result[key] = typeof value === 'object' && value !== null ? () => generator(value) : () => value; } } return result; }
不过你的原始需求用第一个实现就完全足够了。
内容的提问来源于stack exchange,提问作者Guke Skl
相关产品推荐
相关产品推荐

