如何在TypeScript中推断对象类型并结合泛型扩展它
实现仅指定单个泛型参数、自动推断对象类型并合并的TypeScript函数
要实现你想要的效果,核心是利用TypeScript的泛型参数部分指定特性:定义两个泛型参数,其中一个手动指定额外类型,另一个让TypeScript自动推断输入对象的类型,最后返回两者的交叉类型。
正确实现代码
function addType<E extends object, T extends object>(obj: T): T & E { // 合并对象并返回,用类型断言告知TS返回的是交叉类型 return { ...obj } as T & E; }
调用示例与类型验证
// 仅手动指定额外类型E,输入对象的类型T会被自动推断 const x = addType<{ extraProp: number }>({ someProp: 1 }); // x的类型自动推导为: // { // someProp: number; // extraProp: number; // } // 类型检查正常通过 x.someProp; // 类型为number x.extraProp; // 类型为number
原理说明
- 泛型参数设计:
E:手动指定的额外类型,约束为object确保只能传入对象类型T:自动推断的输入对象类型,同样约束为object
- 类型推断逻辑:调用时,TypeScript会自动从参数
obj推断出T的类型,而E则是你手动指定的类型 - 返回类型:使用交叉类型
T & E合并两个类型,得到同时包含两者属性的对象类型 - 函数实现:用扩展运算符
...合并输入对象,再通过类型断言as T & E让TypeScript认可返回值的类型(TS无法自动识别扩展后的对象是交叉类型)
注意事项
- 如果输入对象
obj和额外类型E存在同名属性,交叉类型中该属性的类型会是两者类型的交叉(比如T中a: string,E中a: number,则返回类型中a的类型为string & number,即never),使用时需避免属性冲突 - 若要兼容空对象输入,可以给
T设置默认值:T extends object = {},这样调用addType<{ foo: string }>({})也能正常推断类型
内容的提问来源于stack exchange,提问作者Luis Herranz
相关产品推荐
相关产品推荐

