@fasteroid/traits
v1.0.0
Published
Mixin metadata for the masses!
Maintainers
Readme
@fasteroid/traits
Mixin metadata for the masses!
Premise
The real world is messy. Not every concept lends itself to neat representation in a hierarchy. For all their troubles, patterns like mixins and entity component systems are the most powerful ways to split and recombine concepts in your codebase.
Typically in TypeScript, people reach for mixins, but I wasn't aware of anything out there that made it easy for mixins to query for the presence of others, ECS-style. This package makes an attempt at solving that problem.
Usage
// 'TraitsList' needed in imports to export traits since they reference it. See TS4023 for details.
import { Trait, hasTrait, TraitsList } from './index'
export const HealthTrait = Trait(
base => class HealthComponent extends base {
_health = 100; // private and protected fields don't work if you want to export the trait. See TS4094 for details.
public get health() { return this._health }
public set health(hp: number) {
hp = Math.max(hp, 0);
if( hp === 0 && this._health !== 0 ) {
console.log("Entity", this, "died")
}
this._health = hp;
}
},
Symbol("Health")
)
export const FlammableTrait = Trait(
base => class FlammableComponent extends base {
public onFireFramesLeft = 0;
public tick() {
if( this.onFireFramesLeft <= 0 ) return;
this.onFireFramesLeft--;
if( hasTrait(this, HealthTrait) ) {
this.health -= 1;
}
}
public ignite(frames: number) {
this.onFireFramesLeft += frames;
}
},
Symbol("Flammable")
)
// protip: invoke a trait with no args to get a constructor for the trait
const player = new ( HealthTrait( FlammableTrait() ) );
player.ignite(200);
setInterval( () => player.tick(), 33 ); // the player will die from the fire in a few secondsPlans for the future...
- Find a workaround for
TS4023so you can at least export traits with "private" properties - Make adding a trait to a constructor which already has that trait a no-op, regardless of order
- Find a way to introduce fewer prototype chain entries for better performance
License
MIT License
