静态和动态接口声明,构造函数

时间:2018-02-16 10:51:18

标签: typescript

我对类型定义有点困惑:

我想要一个正确的类型定义:

   var AClass = function (param) {
        this.field = param;
    };


    var aVariable = new AClass(1);

我创建了这个,但编译器抱怨AClass类型错误:

interface ATypeStatic {
    new(param: number): AType;
}

interface AType {
    field: number;
}

declare var AClass: ATypeStatic;

看起来我没有完全掌握' new'在类型声明中。

摘要:

我有:

 var AClass = function (param) {
    this.field = param;
};

我想:

一个有效的Typescript接口,它掌握了这个函数的功能,创建了一个带有名为' field'的参数的对象。用new调用时(显然不是此函数的返回类型)。

我不想要:

任何包含关键字class的内容 - 我在这里处理遗留代码,我不应该改变。

我会接受:

任何文档提示解释IF和WHY这不包含在Typescript中。

2 个答案:

答案 0 :(得分:0)

您的示例有效,但您最终没有使用AClass,最终会得到AType。您可以将new和字段组合到一个界面中:

interface AClass {
    new(param: number): AClass;
    field: number;
}

declare var AClass: AClass;

var aVariable = new AClass(1);

在这个例子中,我们保留了名称AClass,而TypeScript知道你在类型注释中的类型(因此它理解AClass的两个概念。

替代地

如果你想把实现放在同一个文件中......你可以省去所有这些,只需要一个类:

class AClass {
    constructor(public field: number) {
    }
}

var aVariable = new AClass(1);

答案 1 :(得分:0)

我想说使代码在TS中运行的最简单方法是使用" magic" 任何类型:

var AClass = function (param: string) {
    this.field = param;
};
var aVariable = new (AClass as any)(1);

您可以添加一些输入(如果需要)并将该功能转换为任何类型,以便将其转换为自定义界面( IAClassConstructor ):

interface IAClass {
    field: any;
}

interface IAClassConstructor {
    new(param: any): IAClass;
}

var AClass: IAClassConstructor = (function (param: string) {
    this.field = param;
} as any);

var aVariable: IAClass = new AClass(1);

这是example on the Playground

提示答案"为什么它不会被TS"自动转换。会是这样的:"它没有被转换,因为函数不应该被用作构造函数,如果你想/需要以这种方式使用函数,你需要将它们转换为正确的类型&#34 ;