TypeScript中如何让Model接口自动推断get方法的参数类型?
TypeScript泛型自动推断问题解决
问题代码与报错
定义了如下泛型接口:
interface Model<T extends Type> { type: T get?: (value: ToNodeType<T>) => any }
想要通过type属性自动推断get方法的参数类型,编写了以下代码:
const model: Model = { type: 'int', get: (v) => 0 }
运行时报错:泛型类型“Model”需要1个类型参数。
解决方案
直接使用Model而不指定泛型参数会触发报错,要实现自动推断,最佳方式是通过泛型工厂函数让TypeScript推导泛型类型:
// 定义泛型工厂函数 function createModel<T extends Type>(model: Model<T>) { return model; } // 使用时自动推断类型 const model = createModel({ type: 'int', get: (v) => 0 // v的类型会自动推断为ToNodeType<'int'> });
原理说明
TypeScript无法直接从对象字面量的属性值推断泛型接口的类型参数,必须借助泛型函数的参数推导机制。通过工厂函数传入对象字面量,TypeScript会根据type属性的值自动推导泛型T的类型,进而确定get方法的参数类型。
内容的提问来源于stack exchange,提问作者flycran
相关产品推荐
相关产品推荐

