Skip to content


Folders and files

Last commit message
Last commit date

Latest commit



50 Commits

Repository files navigation


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