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

TypeScript如何优雅实现父类clone方法自动推断子类返回类型

问题解决方案

直接使用 TypeScript 内置的多态 this 类型即可满足需求,不需要重复编写子类方法,也不需要冗余的泛型参数传递。


正确实现代码

首先修正你代码里的拼写错误(你多处把Animal错写为Aniaml),基类直接将clone方法的返回值标注为this即可:

class Animal {
  public clone(): this {
    // 替换为你实际的克隆逻辑,比如structuredClone(this)、自定义深拷贝函数都可以
    return clone(this)
  }
}

// 所有派生类不需要额外编写任何clone相关代码
class Dog extends Animal {}
class Cat extends Animal {}

类型效果验证

const dog = new Dog()
const clonedDog = dog.clone() // TS自动推导clonedDog类型为Dog,无需类型断言

const cat = new Cat()
const clonedCat = cat.clone() // 自动推导clonedCat类型为Cat

哪怕是多层继承,类型推导依然生效:

class Corgi extends Dog {
  public legLength = 10
}
const corgi = new Corgi()
const clonedCorgi = corgi.clone() // 自动推导为Corgi类型,可直接访问legLength属性

其他方案的问题说明

  • 每个子类重复实现clone方法:完全重复逻辑,违反DRY原则,新增子类时容易遗漏实现
  • 基类直接返回Animal类型:丢失子类类型信息,调用方必须手动做类型断言
  • 泛型CRTP写法(class Animal<T>子类传自身类型作为泛型):新增子类时必须手动传入自身类型作为泛型参数,冗余且容易写错,远不如多态this简洁

注意事项

this类型仅做静态类型推导,你需要自行保证clone方法的运行时逻辑确实返回了和当前实例同类型的对象。如果子类存在需要特殊处理的克隆逻辑,依然可以在子类中重写clone方法,返回类型依然会被正确推导。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 19:18:43