Symbol 作为标识

在非常大型的应用程序里,字符串作为类型标识被 InversifyJS 注入,会导致命名冲突。 InversifyJS 支持和推荐使用 Symbol 而不是字符串字面量。

Symbol 是一种特殊的、不可变的数据类型,可以作为对象属性的标识符使用。Symbol 对象是一个 symbol 基本数据类型的隐式对象包装器。

import { Container, injectable, inject } from "inversify";

let Symbols = {
    Ninja : Symbol.for("Ninja"),
    Katana : Symbol.for("Katana"),
    Shuriken : Symbol.for("Shuriken")
};

@injectable()
class Katana implements Katana {
    public hit() {
        return "cut!";
    }
}

@injectable()
class Shuriken implements Shuriken {
    public throw() {
        return "hit!";
    }
}

@injectable()
class Ninja implements Ninja {

    private _katana: Katana;
    private _shuriken: Shuriken;

    public constructor(
        @inject(Symbols.Katana) katana: Katana,
        @inject(Symbols.Shuriken) shuriken: Shuriken
    ) {
        this._katana = katana;
        this._shuriken = shuriken;
    }

    public fight() { return this._katana.hit(); };
    public sneak() { return this._shuriken.throw(); };

}

var container = new Container();
container.bind<Ninja>(Symbols.Ninja).to(Ninja);
container.bind<Katana>(Symbols.Katana).to(Katana);
container.bind<Shuriken>(Symbols.Shuriken).to(Shuriken);

results matching ""

    No results matching ""