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
我们做的第一件事是this
在Employee
函数中键入关键字 – 明确地将其设置为any
.
这样我们在设置属性和方法时就不会出错this
。
在使用关键字之前,我们使用
类型断言
将函数Employee
类型化为正确的。any
new
这使类型检查器符合要求,但看起来不太好,因此仅当您无法将构造函数转换为类时才应使用它。
在现代代码中,您很少会看到构造函数,因为使用类通常更直观,并且类型安全性更高。
额外资源
您可以通过查看以下教程来了解有关相关主题的更多信息: