Typescript或JS类扩展

时间:2018-11-09 14:34:29

标签: typescript extension-methods mixins

假设我要在游戏中上课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支持吗?对于该主题,我还能阅读什么?

1 个答案:

答案 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();