Apply traits with decorators

Downloads in past


13711.0.19 years ago9 years agoMinified + gzip package size for traits-decorator in KB


npm version Build Status bitHound Score
Experimental library to apply Traits with ES7 decorators.


using npm

npm i -S traits-decorator

using git repository
npm i -S git://



@traits(Trait1, ...TraitN)

Applicable to class definition. It will apply all the given Traits to the class.
@traits(TExample) class MyClass {}

@requires(description1, ...descriptionN)

Applicable to a method defined in a Trait. The decorator does nothing but it serves as a documentation to reflect what method / property the method needs access to.
class TFoo {

    @requires('bar: {String}')
    fooBar() {
        console.log('foo,' +;


excludes(Method1, ...MethodN)

Applicable to Trait definition in '@traits'. It will exclude the given method names from the Trait.
@traits(TExample::excludes('foo', 'bar')) 
class MyClass {}

alias(aliases: {})

Applicable to Trait definition in '@traits'. It will alias the method defined in the Trait with the key as the value .
@traits(TExample::alias({baz: 'parentBaz'}))
class MyClass {}

as({alias: {}, excludes: })

Applicable to Trait definition in '@traits'. It will apply aliases and excluded methods from the Trait
@traits( TExample:as({alias: {baz: 'parentBaz'}, excludes:['foo', 'bar'] }) )
class MyClass {}


Basically, we have a few Traits (classes) TFirst, TLast and we combine and apply them by using traits decorator:

'use strict';

import { traits, excludes, alias, requires }  from 'traits-decorator'

class TFirst {

    first() {
        return this.collection[0];


class TLast {
    last() {
        let collection = this.collection;
        let l = collection.length;
        return collection[l-1];

    justAnother() {}

    foo() {
        console.log('from TLast\'s foo');

//composing a Trait with others
@traits( TFirst, TLast::excludes('foo', 'justAnother') )
class TEnum {

    foo() {
        console.log('enum foo')

//apply trait TEnum
@traits(TEnum::alias({ foo: 'enumFoo' }) )
class MyClass {

    constructor (collection: []) {
        this.collection = collection

let obj = new MyClass([1,2,3])

console.log(obj.first()) // 1

obj.enumFoo() // enum foo

In order to run the example.js we need babel and since we are using some experimental functionality, decorators (@traits) and bindOperator (::) we need to use the --stage 0.
babel-node --stage 0 example.js


@mixins decorator has been removed. If you want to use mixins please use mixins-decorator package.