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

TypeScript中如何让Discount类支持Product及其子类作为类型?

问题解决方案与优化建议

一、解决Discount支持Product及其子类的问题

你当前的核心问题是构造函数参数的类型声明错误:你传入的是类本身(Product/Beverage构造函数),但声明的类型是Product(实例类型)。要支持Product及其子类的构造函数,需要将类型改为构造函数类型而非实例类型。

方案1:直接使用父类构造函数类型

将type参数的类型改为typeof Product,由于子类构造函数是父类构造函数类型的子类型,Beverage可以直接传入:

class Discount {
    constructor(type: typeof Product, quantity: number){}
}

new Discount(Product, 23) // 正常工作
new Discount(Beverage, 12) // 现在可正常工作

方案2:泛型约束增强类型安全性

如果需要更明确的类型关联,可以用泛型约束限定传入的构造函数必须是Product的子类:

class Discount<T extends Product> {
    constructor(type: new () => T, quantity: number){}
}

new Discount(Product, 23)
new Discount(Beverage, 12)

这里new () => T表示能创建T实例的构造函数类型,泛型T被约束为Product的子类型,进一步强化了类型校验。

二、更优的TypeScript类构建方式

1. 将Product改为抽象类

你的Product类设计为父类,但value()方法仅抛出异常,说明它不应该被直接实例化。改用抽象类+抽象方法的方式,既能避免误实例化,又能强制子类实现核心方法:

interface ProductInterface {
    value(): number;
}  

abstract class Product implements ProductInterface {
    abstract value(): number; // 抽象方法,子类必须实现
}

class Beverage extends Product {
    value(): number {
        return 50;
    }
}

2. 依赖接口而非具体类解耦

如果Discount只关心产品的value()能力,可让它依赖接口对应的构造函数类型,而非具体的Product类,扩展性更强:

// 定义实现ProductInterface的构造函数类型
type ProductConstructor = new () => ProductInterface;

class Discount {
    constructor(type: ProductConstructor, quantity: number){}
}

后续任何实现ProductInterface的类,无论是否继承Product,都能传入Discount。

3. 结合泛型实现类型安全的业务逻辑

如果Discount需要创建产品实例并计算业务值,可以在类内部利用构造函数创建实例,同时通过泛型保持类型安全:

class Discount<T extends ProductInterface> {
    private productConstructor: new () => T;
    constructor(type: new () => T, private quantity: number) {
        this.productConstructor = type;
    }

    // 示例:计算总价值
    calculateTotal(): number {
        const product = new this.productConstructor();
        return product.value() * this.quantity;
    }
}

const beverageDiscount = new Discount(Beverage, 12);
console.log(beverageDiscount.calculateTotal()); // 输出600

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 17:05:46