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

TypeScript类中实现静态clone方法时如何移除any类型

移除TypeScript静态clone方法中的any类型

要移除clone方法里的any类型,核心是让TypeScript自动推导出自类的Settings泛型类型,不需要用any来模糊约束。下面提供两种可行的修改方案:

方案一:利用类型推导简化构造函数类型

type Constructor<T> = { new (settings: T['settings']): T }

class Base<Settings> {
    static clone<T extends Base<unknown>>(this: Constructor<T>, node: T): T {
        return new this(node.settings);
    }

    settings: Settings;

    constructor(settings: Settings) {
        this.settings = settings;
    }
}

class Sub<T> extends Base<T> {}

Sub.clone(new Sub({})); // 类型推导正常,无any

改动说明:

  • 重构Constructor类型:不再显式传递参数类型S,而是直接从泛型T的settings属性中提取构造函数的参数类型,让类型推导更自动化。
  • 替换Base<any>为Base<unknown>:unknown是类型安全的顶级类型,相比any不会绕过TypeScript的类型检查,同时保留了对所有Base子类的约束能力。

方案二:显式关联子类与Settings类型

如果希望类型关联更清晰,可以显式绑定泛型T和Settings的关系:

type Constructor<T extends Base<S>, S> = { new (settings: S): T }

class Base<Settings> {
    static clone<T extends Base<S>, S>(this: Constructor<T, S>, node: T): T {
        return new this(node.settings);
    }

    settings: Settings;

    constructor(settings: Settings) {
        this.settings = settings;
    }
}

class Sub<T> extends Base<T> {}

Sub.clone(new Sub({})); // 类型完全匹配,无any

改动说明:

  • 让Constructor的泛型T明确继承自Base<S>,这样TypeScript能直接推断出node.settings的类型就是S,和构造函数的参数类型完全对齐,彻底消除any的使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 02:44:54