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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 23:02:47