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

如何在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

原理说明

  1. 泛型参数设计:
    • E:手动指定的额外类型,约束为object确保只能传入对象类型
    • T:自动推断的输入对象类型,同样约束为object
  2. 类型推断逻辑:调用时,TypeScript会自动从参数obj推断出T的类型,而E则是你手动指定的类型
  3. 返回类型:使用交叉类型T & E合并两个类型,得到同时包含两者属性的对象类型
  4. 函数实现:用扩展运算符...合并输入对象,再通过类型断言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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 16:14:59