【问题标题】:Unknown syntax in typescript interface打字稿界面中的未知语法
【发布时间】:2016-06-30 15:41:32
【问题描述】:

我有一个定义文件,里面有这个:

interface _Form {
    Dump:string;
}

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

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

如果我尝试用这个来实现这个接口:

class MyForm implements Form {
    Dump:string;
}

我收到此错误:

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

【问题讨论】:

    标签: syntax typescript interface


    【解决方案1】:

    您所做的是定义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");
    

    Array (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 类(这是一个关键字)必须是一个函数,并且只有一个使用该名称的函数。

    【讨论】:

    • 该接口是自动生成的。我需要的是用一个类来实现该接口,并且我已经尝试使用一个带有构造函数的类来实现它,但我仍然得到错误。我找到的唯一解决方案是手动删除接口中的构造函数声明
    • 我改了答案
    • 我明白了,我担心这不可能实现。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-21
    • 2021-12-04
    • 2018-02-04
    • 2018-04-08
    • 1970-01-01
    • 2019-04-18
    • 1970-01-01
    相关资源
    最近更新 更多