我对类型定义有点困惑:
我想要一个正确的类型定义:
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中。
答案 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);
提示答案"为什么它不会被TS"自动转换。会是这样的:"它没有被转换,因为函数不应该被用作构造函数,如果你想/需要以这种方式使用函数,你需要将它们转换为正确的类型&#34 ;