Tagged bindings
We can use tagged bindings to fix AMBIGUOUS_MATCH errors when two or more
concretions have been bound to an abstraction. Notice how the constructor
arguments of the Ninja class have been annotated using the @tagged decorator:
interface Weapon {}
@injectable()
class Katana implements Weapon {}
@injectable()
class Shuriken implements Weapon {}
interface Ninja {
katana: Weapon;
shuriken: Weapon;
}
@injectable()
class Ninja implements Ninja {
public katana: Weapon;
public shuriken: Weapon;
public constructor(
@inject("Weapon") @tagged("canThrow", false) katana: Weapon,
@inject("Weapon") @tagged("canThrow", true) shuriken: Weapon
) {
this.katana = katana;
this.shuriken = shuriken;
}
}
We are binding Katana and Shuriken to Weapon but a whenTargetTagged
constraint is added to avoid AMBIGUOUS_MATCH errors:
container.bind<Ninja>(ninjaId).to(Ninja);
container.bind<Weapon>(weaponId).to(Katana).whenTargetTagged("canThrow", false);
container.bind<Weapon>(weaponId).to(Shuriken).whenTargetTagged("canThrow", true);