Динамическая типизация в Javascript

Пример реализации RTTS на TypeScript

Предвкушая релиз Angular2 хочется больше понять мотивацию разработчиков и понять как и что устроено будет. Изучая на раскопках следы AtScript, который предлагалось использовать изначально как альтернативу TypeScript, а точнее даже ECMAScript наткнулся на упоминание RTTS — RunTime Type System.

Предлагалось использовать аннотации типов, синтаксис которых взяли из стандарта ECMASCript 4, который был реализован в версиях ActionScipt. Но, в отличие от TypeScript, эти аннотации должны были проверяться не IDE на стадии компиляции (точнее не только на стадии компиляции), а и во время исполнения кода.

Некоторые скептики часто приводят такой аргумент, не в пользу TypeScript, мол а что толку-то от статической типизации? На стадии компиляции сделали проверку, а во время выполнения уже не отследить и приходится либо добавлять в бизнес логику проверку типов либо пустить все на самотек, JS умный, он все приведет к нужному типу сам.

Мне стало интересно, а что если сделать самому свой синтаксис описания типов, которые будут проверяться в рантайме. Разбираться с AST и писать свой парсер не хочу. Хочу использовать стандартные инструменты. О! В предыдущих статьях было много сказано про декораторы, оператор декорирования и аннотации, т.е. мы можем использовать декораторы для контроля типов наших переменных используя простой и лаконичный синтаксис.

В итоге родилась библиотека rtts-ts. Это декораторы для TypeScript кода, которые позволяют аннотировать свойства, методы и параметры. Как это выглядит:

///<require path="rtts/typings.d.ts" />
// Делаем экспорт всех нужных декораторов в глобальную область
import 'rtts';

@type // annotate constructor
class A {

@tstring public foo :string = 'abc';
@tnumber static bar :number = 123;

@tfloat protected baz :float = 123.321;
@tint private lol :int = 123;


/* @type */ constructor(private @tnumber x :number) {}

@type mixFoo(@tstring arg :string) :string {
return this.foo + arg;
}

@type mixBar(@cast('int') arg :any) :number {
return this.bar + arg;
}

@type({
'arguments' : ['string', 'number'],
'return' : 'string'
})

someDo(a :string, b :number) :string {
return a + b;
}

// return type string
@type('string') static someDo(@tstring a :string,
@tnumber b :number) :string {
return a + b;
}
}

Таким образом мы можем проверять типы на стадии компиляции, используя аннотации вида :тип, так и аннотации для рантайма, используя синтаксис @тип.

Установить и попробовать можно из npm:

npm install rtts-ts

Версия библиотеки, пока 0.1, я еще не реализовал все возможности. Если интересно — присоединяйтесь.