Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 如何为动态创建的类方法提示类型?_Typescript - Fatal编程技术网

Typescript 如何为动态创建的类方法提示类型?

Typescript 如何为动态创建的类方法提示类型?,typescript,Typescript,我有以下课程: 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 {
  log (level, message) {
    // some code for logging
  }
}

for (const LEVEL of LOG_LEVELS) {
  Logger.prototype[LEVEL] = function(message) {
    this.log(LEVEL, message);
  }
}
我想用typescript键入上面的提示代码

我尝试了以下方法:

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);
  };
}
但我在类定义中得到了“类属性声明中的计算属性名称必须引用类型为文字类型或“唯一符号”类型的表达式”,以及“元素隐式地具有“any”类型,因为“string”类型的表达式不能用于索引原型扩展上的“Logger”类型”

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


我使用的是typescript 3.5.3。

您可以使用接口/类合并将映射类型合并到类中。如果我们在日志级别中使用
作为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 


const LOG_LEVELS=['error','warn','info','debug']作为const;
接口记录器扩展记录无效>{}
类记录器{
公共日志(级别:string,消息:string):无效{
//一些日志代码
}
}
for(日志级别的常量级别){
Logger.prototype[LEVEL]=函数(消息:字符串):void{
此.log(级别、消息);
};
}
新建记录器()。错误(“”//确定