我应该将啥类型添加到作为参数接收的类构造函数中?

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 对象。 是的,但实际上类构造函数也是一个函数。 哦,然后添加一个类型转换。

以上是关于我应该将啥类型添加到作为参数接收的类构造函数中?的主要内容,如果未能解决你的问题,请参考以下文章

我应该将啥作为参数传递给期望 NSError** 的方法?

我应该将啥对象传递给需要 Void 的函数!在参数中? (科特林)

php面向对象构造函数,析构函数

一个完整的C++类应该包含什么?

PHP构造函数和析构函数

带有向量的类构造函数中的析构函数调用