TS:目标缺少构造签名的“新”表达式

TS: ‘new’ 表达式,其目标缺少构造签名

TS – ‘new’ expression whose target lacks construct signature

“new expression, whose target lacks a construct signature”错误发生在我们在new不应该使用关键字的地方使用关键字或将其与构造函数一起使用时。

要解决该错误,请将构造函数转换为类或删除
new关键字。

有时错误的解决方案是删除关键字new如果您不想创建某物的实例,则不应使用该new关键字。

下面是错误如何发生的示例。

索引.ts
function Employee(fullName: string, salary: number) { this.fullName = fullName; this.salary = salary; this.getSalary = function () { return this.salary; }; } // ⛔️ Error: 'new' expression, whose target lacks a // construct signature, implicitly has an 'any' type.ts(7009) const emp1 = new Employee('James Doe', 100);

我们将new关键字与导致错误的构造函数一起使用。

TypeScript 希望我们将构造函数转换为类以提高类型安全性。

将构造函数转换为类

要解决这种情况下的错误,请将构造函数转换为类。

索引.ts
class Employee { constructor(public fullName: string, public salary: number) { this.fullName = fullName; this.salary = salary; } getSalary() { return this.salary; } } const emp1 = new Employee('Bobby Hadz', 100); console.log(emp1.fullName); // 👉️ "Bobby Hadz" console.log(emp1.getSalary()); // 👉️ 100

此类创建与构造函数等效的对象,但允许我们使用new关键字来创建实例。

TypeScript 为类提供了比构造函数更好的类型检查。

改用 hacky 解决方案

有时由于某种原因您无法将函数转换为类。

如果是这种情况,您可以使用这个 hacky 解决方案。

索引.ts
function Employee(this: any, fullName: string, salary: number) { this.fullName = fullName; this.salary = salary; this.getSalary = function () { return this.salary; }; } // ✅ No type checker errors const emp1 = new (Employee as any)('Bobby Hadz', 100); console.log(emp1.fullName); // 👉️ "Bobby Hadz" console.log(emp1.getSalary()); // 👉️ 100

我们做的第一件事是thisEmployee函数中键入关键字 – 明确地将其设置为any.

这样我们在设置属性和方法时就不会出错this

在使用关键字之前,我们使用
类型断言
将函数
Employee类型化为正确的anynew

这使类型检查器符合要求,但看起来不太好,因此仅当您无法将构造函数转换为类时才应使用它。

在现代代码中,您很少会看到构造函数,因为使用类通常更直观,并且类型安全性更高。

额外资源

您可以通过查看以下教程来了解有关相关主题的更多信息: