我正在将一些旧的 ES5 项目转换为 TypeScript。在这些项目中,有如下定义的老式类(函数)(简化示例):
function MyClass(arg1) {
this.arg_prop_1 = arg1;
this.arg_prop_2 = function() { return this.arg_prop_1; }
}
MyClass.prototype.proto_prop = function() { return this.arg_prop_2() === 42; }
const obj = new MyClass(42);
console.assert(obj.proto_prop());
在不实际将其更改为 ES6 类语法的情况下键入此代码的正确/推荐/最佳方法是什么?
我尝试过的:
为了启用 TypeScript,我定义了一些声明如下(不工作):
interface MyClassThis {
arg_prop_1: number;
arg_prop_2: () => number;
proto_prop: () => boolean;
}
interface MyClassCtor {
new (arg1: number): MyClassThis;
}
首先,我只是遵循了一些“日期”类型的代码from here。由于上面是不工作(错误:'new'表达式,其目标缺少构造签名,隐式具有'any'类型。(7009)),我不完全确定什么是正确的定义方法此类旧式类函数的类型。
如果您无法更改源代码,则将其保留为
.js
并提供一个提供文件类型的.d.ts
文件。
// my-class.js
export function MyClass(arg1) {
this.arg_prop_1 = arg1;
this.arg_prop_2 = function () {
return this.arg_prop_1;
};
}
MyClass.prototype.proto_prop = function () {
return this.arg_prop_2() === 42;
};
// my-class.d.ts
export interface MyClass {
arg_prop_1: string;
arg_prop_2(): string;
proto_prop(): boolean;
}
export const MyClass: {
new (arg1: string): MyClass;
};
现在您可以将它与这些类型一起使用:
import { MyClass } from "./my-class";
const instance = new MyClass("a string");
instance.proto_prop(); // boolean