在打字稿中增加抽象方法
Augment abstract method in typescript
我有抽象 class Command
和抽象方法“execute()
”。许多其他命令扩展了它。每个都有自己的“execute()
”实现。
如何在每次执行任何命令时添加一些通用逻辑(如日志记录)?
export abstract class Command {
public abstract execute(...commandParams: any[]): void;
}
在我看来,最好的处理方法是在 调用 执行方法而不是在方法本身内部。
您不会对 execute
函数参数进行良好的类型检查,因为它们被定义为 ...commandParams: any[]
。在这里,我们可以使用泛型来强制所有 Command
类型都适合通用接口,同时也不会丢失有关其独特参数的信息。
仅供参考,这也可以是 interface
而不是 abstract class
。
interface Command<T extends any[]> {
execute( ...commandParams: T): void;
toString(): string;
}
class Executer {
execute<T extends any[]>( command: Command<T>, ...args: T ) {
command.execute(...args);
}
executeAndLog<T extends any[]>( command: Command<T>, ...args: T ) {
console.log( `executing command ${command.toString()} with arguments:`, ...args );
command.execute(...args);
}
}
Executer
中的泛型 T
表示我们可以传入任何类型的 Command
,但参数必须与该特定命令类型的预期参数相匹配。
我有抽象 class Command
和抽象方法“execute()
”。许多其他命令扩展了它。每个都有自己的“execute()
”实现。
如何在每次执行任何命令时添加一些通用逻辑(如日志记录)?
export abstract class Command {
public abstract execute(...commandParams: any[]): void;
}
在我看来,最好的处理方法是在 调用 执行方法而不是在方法本身内部。
您不会对 execute
函数参数进行良好的类型检查,因为它们被定义为 ...commandParams: any[]
。在这里,我们可以使用泛型来强制所有 Command
类型都适合通用接口,同时也不会丢失有关其独特参数的信息。
仅供参考,这也可以是 interface
而不是 abstract class
。
interface Command<T extends any[]> {
execute( ...commandParams: T): void;
toString(): string;
}
class Executer {
execute<T extends any[]>( command: Command<T>, ...args: T ) {
command.execute(...args);
}
executeAndLog<T extends any[]>( command: Command<T>, ...args: T ) {
console.log( `executing command ${command.toString()} with arguments:`, ...args );
command.execute(...args);
}
}
Executer
中的泛型 T
表示我们可以传入任何类型的 Command
,但参数必须与该特定命令类型的预期参数相匹配。