typescript接口中的语法未知

时间:2016-06-30 15:41:32

标签: syntax typescript interface

我有一个定义文件:

interface _Form {
    Dump:string;
}

interface Form extends _Form { constructor:{ new():Form }; }

constructor:{ new():Form };是什么意思?

如果我尝试使用此实现此接口:

class MyForm implements Form {
    Dump:string;
}

我收到此错误:

  

Class'MyForm'错误实现了接口'Form'   属性“构造函数”的类型是不兼容的   类型'功能'不能分配给'new()=>类型表”。
  “函数”类型不匹配签名'new():Form'

1 个答案:

答案 0 :(得分:0)

您所做的是定义Form有一个名为constructor的属性,它是一个Form构造函数(即返回Form的新实例的函数)

要解释,请考虑以下事项:

class Form {}

type FormConstructor = { new(): Form };
let formCtor: FormConstructor = Form;
let form: Form = new formCtor();

您也可以这样定义静态属性/函数:

class Form {
    private dump: string;

    constructor() {}

    static fromDump(dump: string): Form {
        let form = new Form();
        form.dump = dump;
        return form;
    }
}

type FormConstructor = {
    new(): Form;
    fromDump: (dump: string) => Form;
};

let form1: Form = new Form();
let form2: Form = Form.fromDump("dump");

let formCtor: FormConstructor = Form;
let form3: Form = new formCtor();
let form4: Form = formCtor.fromDump("dump");

一个很好的例子是数组(lib.ts& lib.es6.ts)和ArrayConstructor(lib.d.ts& lib.es6.d.ts)。

在你的情况下,虽然我没有看到这个的原因,你可能只想定义一个类构造函数:

interface Form {
    dump: string;
}

class MyForm implements Form {
    dump: string;

    constructor(dump: string) {
        this.dump = dump;
    }
}

您不需要在接口中指定实现类需要有一个ctor,这是给定的。

修改

如果该界面是自动生成的,那么你需要停止使用生成它的任何东西,因为它做得很糟糕。
那个界面(我很确定)不可能实现,这里有点接近:

interface _Form {
    Dump:string;
}

interface Form extends _Form { ctor:{ new():Form }; }

class MyForm implements Form {
    public ctor: { new():Form };
    public Dump: string;

    constructor() {
        this.ctor = MyForm;
    }
}

code in playground

除了我将它从constructor更改为ctor之外,它完全相同,并且它编译得很好(尽管它仍然没有意义)。
如果您将ctor更改为constructor

class MyForm implements Form {
    public constructor: { new():Form };
    public Dump: string;

    constructor() {
        this.constructor = MyForm;
    }
}

你会得到错误,因为类constructor(这是一个关键字)需要是一个函数,只有一个使用该名称。