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

如何在TypeScript中无需类实现可自动推断泛型的动态对象类型?

不用类实现自动推断泛型的CustomObject类型

要实现无需显式指定泛型、自动根据属性值推断类型的CustomObject,核心是利用泛型函数的自动推断特性——TypeScript无法直接对类型别名的泛型参数做自动推断,但可以通过函数调用时的参数推导来间接实现。

步骤1:定义泛型类型别名

先明确CustomObject的泛型结构,约束x的取值只能是1或2:

type CustomObject<T extends 1 | 2> = {
  x: T;
};

步骤2:创建工厂函数实现自动推断

写一个泛型工厂函数,接收包含x的对象参数,TS会自动根据传入的x值推断泛型T,并返回对应的CustomObject<T>类型:

function createCustomObject<T extends 1 | 2>(obj: { x: T }): CustomObject<T> {
  return obj;
}

步骤3:使用方式

调用工厂函数时,无需手动指定泛型,TS会自动识别x的类型:

const obj1 = createCustomObject({ x: 1 });
// obj1的类型自动推断为CustomObject<1>

const obj2 = createCustomObject({ x: 2 });
// obj2的类型自动推断为CustomObject<2>

// 错误示例:传入不符合约束的值会触发TS报错
// const obj3 = createCustomObject({ x: 3 });
// 类型“3”的参数不能赋给类型“1 | 2”的参数

替代方案:类型断言(不推荐)

如果不想用函数,也可以通过类型断言手动推导,但这种方式需要显式写typeof,且无法自动校验参数约束,不如工厂函数安全方便:

const obj = { x: 1 } as CustomObject<typeof obj.x>;

适配你的MyClass场景

在MyClass的构造函数中,可以直接使用CustomObject<1 | 2>的联合类型:

class MyClass {
  constructor(p: Array<CustomObject<1 | 2>>) {
    // TODO
  }
}

// 传入工厂函数生成的对象数组
const items = [createCustomObject({ x: 1 }), createCustomObject({ x: 2 })];
const myClassInstance = new MyClass(items); // 类型完全匹配

内容的提问来源于stack exchange,提问作者eroironico

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 22:55:29