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(级别、消息);
};
}
新建记录器()。错误(“”//确定