如果我有一个类Factory
,它接受另一个类Product
(或其子类)作为参数,并且具有返回实例化的产品的方法将为它们做很多额外的工作,如下所示:
abstract class Product {}
class Wheel extends Product {}
class Roof extends Product {
is_asbestos(){ return false } }
type ProductClass = {new (): Product}
class Factory {
public product_cls: ProductClass;
constructor(product_cls: ProductClass, private regulation_code?: number) {
this.product_cls = product_cls;
}
build_for_france(){
return new this.product_cls();
}
build_for_britain(){
return new this.product_cls();
}
}
let wheel_factory = new Factory(Wheel);
let roof_factory = new Factory(Roof, 123);
let new_roof = roof_factory.build_for_france();
new_roof.is_asbestos(); // error
调用is_asbestos
方法会给我这个错误。
财产' is_asbestos'类型'产品'。
上不存在
那么,我如何告诉TypeScript该函数的返回值是product_cls
值的一个实例,它是一个类。
现在,我可以采用以下方式进行操作,但在每个函数调用时都这样做很傻。
let new_roof = <Roof>roof_factory.build_for_france();
new_roof.is_asbestos();
执行以下操作会给我一个语法错误。
build_for_france(){
let french_product: this.product_cls = new this.product_cls();
return french_product;
}
最后,我使用的是Typescript 2.0.10。我不介意升级TypeScript版本。
答案 0 :(得分:0)
您必须使用泛型来指定工厂构造的类型。
abstract class Product {}
class Wheel extends Product {}
class Roof extends Product {
is_asbestos(){ return false } }
type ProductClass<T> = {new (): T}
class Factory<T extends Product> {
public product_cls: ProductClass<T>;
constructor(product_cls: ProductClass<T>, private regulation_code?: number) {
this.product_cls = product_cls;
}
build_for_france(): T {
return new this.product_cls();
}
build_for_britain(): T {
return new this.product_cls();
}
}
let wheel_factory = new Factory<Wheel>(Wheel);
let roof_factory = new Factory<Roof>(Roof, 123);
let new_roof = roof_factory.build_for_france();
new_roof.is_asbestos(); // ok