Awesome Open Source
Awesome Open Source


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.

License MIT

Get A Weekly Email With Trending Projects For These Topics
No Spam. Unsubscribe easily at any time.
javascript (70,419
nodejs (3,811
decorators (89
es7 (37
trait (27