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

TypeScript泛型函数如何指定泛型T为非原始类型的对象类型

问题解答

你可以给泛型T添加object类型约束实现需求,object在TypeScript中就代表非原始类型,会自动排除number、string、boolean、symbol、null、undefined等原始值,刚好匹配你限制仅传入对象的要求。

修改后的代码如下:

export function clone<T extends object>(o: T): T {
  return Object.setPrototypeOf({ ...o }, o.constructor.prototype);
}

原理解释

  • 你之前的代码没有给泛型加任何类型约束,TypeScript默认认为T可以是任意类型,包括没有constructor属性的原始类型,所以linter会抛出「类型'T'上不存在属性'constructor'」的报错。
  • 添加T extends object约束后,TypeScript会对入参做静态校验,传入原始值时会直接抛出类型错误,同时也能确定入参一定是对象类型,必然存在constructor属性,原有报错会自动消除。

如果你的业务场景需要兼容null入参,可以调整为如下带类型守卫的写法:

export function clone<T extends object | null>(o: T): T {
  if (o === null) return o;
  return Object.setPrototypeOf({ ...o }, o.constructor.prototype) as T;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 20:57:01