如何在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
相关产品推荐
相关产品推荐

