Angular 如何键入类';功能';s作为其类的值返回';类型脚本中的属性?
如果我有一个类Angular 如何键入类';功能';s作为其类的值返回';类型脚本中的属性?,angular,typescript,es6-class,Angular,Typescript,Es6 Class,如果我有一个类工厂,它接受另一个类产品(或其子类)作为参数,并且有返回实例化产品的方法,那么会对它们做很多额外的工作,比如: abstract class Product {} class Wheel extends Product {} class Roof extends Product { is_asbestos(){ return false } } type ProductClass = {new (): Product} class Factory { public
工厂
,它接受另一个类产品
(或其子类)作为参数,并且有返回实例化产品的方法,那么会对它们做很多额外的工作,比如:
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\u
方法会导致此错误
“产品”类型上不存在属性“is_石棉”
那么,我如何告诉TypeScript该函数的返回值是product\u cls
值的一个实例,它是一个类
现在,我可以用下面的方法来实现它,但在每次函数调用中都这样做是愚蠢的
let new_roof = <Roof>roof_factory.build_for_france();
new_roof.is_asbestos();
最后,我使用的是Typescript 2.0.10。我不介意升级TypeScript版本。必须使用泛型来指定工厂构造的类型
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
抽象类产品{}
类轮扩展产品{}
类屋顶延伸产品{
是_(){return false}
类型ProductClass={new():T}
阶级工厂{
公共产品:ProductClass;
建造商(产品编号:ProductClass,私人法规编号?:编号){
this.product_cls=product_cls;
}
为法国建造:T{
返回新的this.product_cls();
}
为英国建造:T{
返回新的this.product_cls();
}
}
让车轮工厂=新工厂(车轮);
let roof_factory=新工厂(roof,123);
让新屋顶=屋顶工厂。为法国建造屋顶();
新屋顶。是石棉();//好啊
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