TypeScript-使用装饰器向类添加方法

时间:2018-12-14 10:29:43

标签: javascript typescript

首先,我对TypeScript还是很陌生,所以如果这是一个愚蠢的问题,我们深表歉意。

我正在尝试创建一个可以使用其他功能扩展的基类。我尝试使用继承,但是后来我意识到您不能扩展多个类。我的下一个尝试是使用装饰器,这似乎可以正常工作,但TypeScript不能为我提供装饰器方法的代码完成。

function Talks<T extends {new(...args:any[]):{}}>(constructor:T) {
    return class extends constructor {
        sayHello(): void {
            console.log('Hello');
        }
    }
}

function Walks<T extends {new(...args:any[]):{}}>(constructor:T) {
    return class extends constructor {
        move(): void {
            console.log('Walk');
        }
    }
}

function Chargeable<T extends {new(...args:any[]):{}}>(constructor:T) {
    return class extends constructor {
        chargeBattery(): void {
            console.log('Charging');
        }
    }
}

@Talks
@Walks
@Chargeable
class Robot { }

@Chargeable
class Calculator { }

const robot = new Robot();

robot.sayHello();
robot.move();
robot.chargeBattery();

const calculator = new Calculator();

calculator.chargeBattery();

Open in TypeScript playground

1)是否可以为使用装饰器添加的方法添加代码自动完成功能?

2)通常是否有更好的方法来扩展具有其他功能(混合和匹配)的类?

1 个答案:

答案 0 :(得分:2)

通过设计装饰者无法更改其装饰的符号的类型。

您可以将装饰器用作常规函数,并手动传递类。您的类型已经正确完成此任务,实际上这是在Typescript中进行混合的recommended方法:

const Robot = Chargeable(Walks(Talks(class {

})));

const Calculator = Chargeable(class { });

const robot = new Robot();

robot.sayHello();
robot.move();
robot.chargeBattery();

const calculator = new Calculator();

calculator.chargeBattery();