如何在 TypeScript 中键入基于原型的 ES5 类?

问题描述 投票:0回答:1

我正在将一些旧的 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)),我不完全确定什么是正确的定义方法此类旧式类函数的类型。

javascript typescript ecmascript-5
1个回答
0
投票

如果您无法更改源代码,则将其保留为

.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

查看代码沙盒

© www.soinside.com 2019 - 2024. All rights reserved.