我应该将啥类型添加到作为参数接收的类构造函数中?
Posted
技术标签:
【中文标题】我应该将啥类型添加到作为参数接收的类构造函数中?【英文标题】:What type I should add to class constructor received as parameter?我应该将什么类型添加到作为参数接收的类构造函数中? 【发布时间】:2020-03-29 15:24:44 【问题描述】:我正在 TypeScript 中创建自己的类装饰器(classLogger
)。在classLogger
中,我将类构造函数作为我的装饰器的一个参数,我想知道我应该在这个参数中添加什么类型(originalConstructor
)?
我正在尝试这样的事情:
export const classLogger = <T>(originalConstructor: (...args: any[]) => T) =>
但是我没有访问我的originalConstructor
的.name
属性,而且我不能在originalConstructor
上使用new。
classLogger
export const classLogger = (originalConstructor: any) =>
const newConstructor = (...args: any[]) => // same story here what type i should add to newConstructor
console.log(`New [$originalConstructor.name], has been created`);
return new originalConstructor(...args)
;
newConstructor.prototype = originalConstructor.prototype;
return newConstructor;
;
战士
import classLogger from "./decorators/classLogger";
@classLogger
export class Warrior
firstName: string;
lastName: string;
age: number;
constructor(firstName: string, lastName: string, age: number)
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
challengeOpponent(message: string): string
return `Hello I am $this.firstName $this.lastName. I want to challenge you! $message`;
附言。我也收到此错误:
错误:(3, 1) TS1238:当作为表达式调用时,无法解析类装饰器的签名。 输入 ' (...args: any[]): any;原型:任何; ' 不可分配给类型 'typeof Warrior'。 输入 ' (...args: any[]): any;原型:任何; ' 不匹配签名 'new (firstName: string, lastName: string, age: number): Warrior'。
在Warrior.ts
文件中
【问题讨论】:
【参考方案1】:构造函数的类型是:
new(...args: any[]): any, name: string
我将您的代码输入为:
export function classLogger<T extends new(...args: any[]): any >(originalConstructor: T)
const newConstructor: T = (...args: any[]) =>
console.log(`New [$(originalConstructor as any).name], has been created`);
return new originalConstructor(...args)
;
newConstructor.prototype = originalConstructor.prototype;
return newConstructor;
;
【讨论】:
有一个FunctionConstructor
类型,但它也没有.name
属性。也许我应该添加IClassConstructor
接口,它将扩展FunctionConstructor
接口并添加name: string
属性?
不,FunctionConstructor
是全局 Function
对象。
是的,但实际上类构造函数也是一个函数。
哦,然后添加一个类型转换。以上是关于我应该将啥类型添加到作为参数接收的类构造函数中?的主要内容,如果未能解决你的问题,请参考以下文章