Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 如何键入类';功能';s作为其类的值返回';类型脚本中的属性?_Angular_Typescript_Es6 Class - Fatal编程技术网

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