【问题标题】:How to hint types for class methods that are dynamically created?如何提示动态创建的类方法的类型?
【发布时间】:2019-12-19 21:10:35
【问题描述】:

我有以下课程:

const LOG_LEVELS = ['error', 'warn', 'info', 'debug'];

class Logger {
  log (level, message) {
    // some code for logging
  }
}

for (const LEVEL of LOG_LEVELS) {
  Logger.prototype[LEVEL] = function(message) {
    this.log(LEVEL, message);
  }
}

我想用打字稿在代码上方输入提示。

我尝试了以下方法:

const LOG_LEVELS = ['error', 'warn', 'info', 'debug'];

class Logger {
  public [key in LOG_LEVELS]: (message: string) => void;

  public log (level: string, message: string): void {
    // some code for logging
  }
}

for (const LEVEL of LOG_LEVELS) {
  Logger.prototype[LEVEL] = function (message: string): void {
    this.log(LEVEL, message);
  };
}

但我在类定义中得到“类属性声明中的计算属性名称必须引用其类型为文字类型或‘唯一符号’类型的表达式”,并且“元素隐含地具有‘任何’类型,因为表达式'string' 类型的不能用于在原型扩展上索引类型'Logger'”。

键入提示动态添加的类方法的正确方法是什么?是否可以在不显式定义所有日志级别方法的情况下实现类型提示?

我正在使用打字稿 3.5.3。

【问题讨论】:

    标签: typescript


    【解决方案1】:

    您可以使用接口/类合并将映射类型合并到类中。如果我们在日志级别中使用as const,我们会按预期获得所有方法:

    
    const LOG_LEVELS = ['error', 'warn', 'info', 'debug'] as const;
    interface Logger extends Record<typeof LOG_LEVELS[number], (message: string) => void> {}
    class Logger {
      public log (level: string, message: string): void {
        // some code for logging
      }
    }
    
    for (const LEVEL of LOG_LEVELS) {
      Logger.prototype[LEVEL] = function (message: string): void {
        this.log(LEVEL, message);
      };
    }
    
    
    new Logger().error("") // ok 
    
    

    Play

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多