假设我要在游戏中上课Warrior
。我的战士只能走路。
class Warrior{
constructor(){}
walk(){
alert ('I can walk!');
}
}
x.walk(); //'I can walk!'
x.fight(); //error
然后,我决定创建一个武器类,以便在激活该类时,我在游戏中的战士可以战斗。我想像的一些伪代码:
class Weapon{
canFight(type:Warrior){
set warrior.fight=()=>{alert('I can fight!')};}
}
let x=new Warrior();
x.walk(); //'I can walk!'
x.fight() //'I can fight!'
因此,当存在某种神奇的扩展代码时,我需要使用新的方法和参数来扩展类本身及其所有实例。因此,我可以将行为封装在单独的类中,并将其扩展到其他类,而无需注意它们。
我看到的是mixins,但其背后的想法是显式更改我的 Warrior 类以封装新功能。我不能只说因为现在我的战士可以战斗,所以我需要将使用 Warriors 的情况更改为某种新类型- FighterWarriors ,如果我需要快速采用新的行为来吸引对象,那将是一个真正的痛苦。
这是使用C#和Swift的有效技术,但我不了解其他语言。
所以问题是:如何在Typescript中做出这种行为?如果不能,纯JS支持吗?对于该主题,我还能阅读什么?
答案 0 :(得分:1)
您可以使用接口合并和模块扩充将成员添加到类型。对于JS部分,事情非常简单,您只需要在Warrior
原型上添加一个新属性
// Warrior.ts
export class Warrior {
constructor() { }
walk() {
alert('I can walk!');
}
}
// Weapon.ts
import {Warrior } from './Warrior'
export class Weapon{
canFight(type:Warrior){
}
}
declare module './Warrior' {
interface Warrior {
fight(): void
}
}
Warrior.prototype.fight = function (this: Warrior){
console.log("FIGHT");
}
// Usage.ts
import {Warrior } from './Warrior'
import './Weapon'
let x=new Warrior();
x.fight();