首先,我对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)通常是否有更好的方法来扩展具有其他功能(混合和匹配)的类?
答案 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();