在打字稿中增加抽象方法

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);
    }
}

Playground Link

Executer 中的泛型 T 表示我们可以传入任何类型的 Command,但参数必须与该特定命令类型的预期参数相匹配。