SlideShare a Scribd company logo
TypeScript
Это не больно, даже прикольно
1
Александр Майоров
Tutu.ru
Александр Майоров
 twitter, github: @frontdevops
 alexander@majorov.su
 mayorov@tutu.ru
Developer advocate & technical evangelist in
Tutu.ru
2
276сотрудников
500 тыс.посетителей в день
2003 г.год основания
Мы продаем туры, ж/д и авиабилеты, билеты на автобусы,
бронируем отели, рассказываем о расписании.
15 млнпосетителей в месяц
Самый посещаемый сервис туристических услуг в России
(по результатам исследования comScore).
3
TypeScript
4
2.0
Опасения при выборе TypeScript
5
Опасения при выборе TypeScript
 Можно писать только ООП код (нет)
6
Опасения при выборе TypeScript
 Можно писать только ООП код (нет)
 Обязательно использовать типы
7
Опасения при выборе TypeScript
 Можно писать только ООП код (нет)
 Обязательно использовать типы
 Другой язык (holy war)
8
Опасения при выборе TypeScript
 Можно писать только ООП код (нет)
 Обязательно использовать типы
 Другой язык (holy war)
 Плохая поддержка в IDE (bullshit)
9
Опасения при выборе TypeScript
 Можно писать только ООП код (нет)
 Обязательно использовать типы
 Другой язык (holy war)
 Плохая поддержка в IDE (bullshit)
 Нужно все переписывать в TS с JS (no)
10
Опасения при выборе TypeScript
 Можно писать только ООП код (нет)
 Обязательно использовать типы
 Другой язык (holy war)
 Плохая поддержка в IDE (bullshit)
 Нужно все переписывать в TS с JS (no)
 Babel умеет больше, развивается быстрее. А для
типов есть Flow (holy war)
11
Факты про TypeScript
12
Факты про TypeScript
 TS – это JavaScript
13
Факты про TypeScript
 TS – это JavaScript
14
class A {
static buz = 'Some buz';
}
class B extends A {
constructor(foo, bar) {
super();
this.foo = foo;
this.bar = bar;
}
getFooWithBar(){
return [ this.foo , this.bar ]
}
}
Факты про TypeScript
 TS – это JavaScript
 Текущая версия 2.0.10 и уже готов RC 2.1 (!)
15
( Angular тоже 2 – совпадение?  )
Факты про TypeScript
 TS – это JavaScript
 Текущая версия 2.0.10 и уже готов RC 2.1
 Строгая типизация опциональна
16
Факты про TypeScript
 TS – это JavaScript
 Текущая версия 2.0.10 и уже готов RC 2.1
 Строгая типизация опциональна
 Развитые инструменты для работы в ООП стиле
17
Факты про TypeScript
 TS – это JavaScript
 Текущая версия 2.0.10 и уже готов RC 2.1
 Строгая типизация опциональна
 Развитые инструменты для работы в ООП стиле
 Режимы (таргеты) транспилирования: ES3, ES5,
ES2015…
18
Факты про TypeScript
 TS – это JavaScript
 Текущая версия 2.0.10 и уже готов RC 2.1
 Строгая типизация опциональна
 Развитые инструменты для работы в ООП стиле
 Режимы транспилирования: ES3, ES5, …
 Поддержка разных модульных систем (ES modules,
Commonjs, AMD, …)
19
Факты про TypeScript
 TS – это JavaScript
 Текущая версия 2.0.10 и уже готов RC 2.1
 Строгая типизация опциональна
 Развитые инструменты для работы в ООП стиле
 Режимы транспилирования: ES3, ES5, …
 Поддержка разных модульных систем
 Делается MS, но код открыт и он на Github
20
Факты про TypeScript
 TS – это JavaScript
 Текущая версия 2.0.10 и уже готов RC 2.1
 Строгая типизация опциональна
 Развитые инструменты для работы в ООП стиле
 Режимы транспилирования: ES3, ES5, …
 Поддержка разных модульных систем
 Делается MS, но код открыт, он на Github
 TS – это диалект JS (лолшто, а как же пункт 1 ?)
21
Факты про TypeScript
 TS – это диалект JS
22
const enum Flag { A = 1, B, C }
interface IA { buz :Flag }
abstract class A<T extends Object> implements IA {
static protected readonly buz :Flag|string = Flag.B;
}
export default class B<T> extends A<T> {
constructor(public foo :T|null, public bar :T|null){
super();
let num :number = parseInt(foo as string);
}
getFooWithBar(...a :Array<T>) :T[] {
return [ this.foo , this.bar, ...a ]
}
}
Факты про TypeScript
 TS – это JavaScript
 Текущая версия 2.0.3
 Строгая статическая типизация опциональна
 Развитые инструменты для работы в ООП стиле
 Режимы транспилирования: ES3, ES5, ES6, …
 Поддержка разных модульных систем
 Делается MS, но код открыт, он на Github
 TS – это диалект JS
 На TS можно писать в ФП стиле
23
Почему стоит писать на TS при работе с Angular2
24
?
НЛО прилетело и удалило слайд, пыщь пыщь
Почему стоит писать на TS при работе с Angular2
25
• П  ТОМУ, что гладиолус…
Почему стоит писать на TS вообще?
26
Почему стоит писать на TS вообще
27
 Отлов некоторых ошибок уже на стадии компиляции
Почему стоит писать на TS вообще
28
 Отлов некоторых ошибок уже на стадии компиляции
 Удобно рефакторить, легче отыскивать breaking changes
Почему стоит писать на TS вообще
29
 Отлов некоторых ошибок уже на стадии компиляции
 Удобно рефакторить, легче отыскивать breaking changes
 Самодокументируемый код (интерфейсы и не только)
Почему стоит писать на TS вообще
30
 Отлов некоторых ошибок уже на стадии компиляции
 Удобно рефакторить, легче отыскивать breaking changes
 Самодокументируемый код, контракты через интерфейсы
 Gradual typings: не требуется указывать типы, но всегда
можно добавить
Почему стоит писать на TS вообще
31
 Отлов некоторых ошибок уже на стадии компиляции
 Удобно рефакторить
 Самодокументируемый код, контракты через интерфейсы
 Gradual typings: не требуется указывать типы, но всегда
можно добавить
 Хорошая навигация по коду и поддержка в IDE
Почему стоит писать на TS вообще
32
 Отлов некоторых ошибок уже на стадии компиляции
 Удобно рефакторить
 Самодокументируемый код, контракты через интерфейсы
 Gradual typings: не требуется указывать типы, но всегда
можно добавить
 Хорошая навигация по коду и поддержка в IDE
 Если вы поклонник ООП – есть все инструменты для ООП
• Бэкендеры PHP, C#, Java, etc … могут понять ваш код и даже
дописать что-то
• Он умеет даже React (JSX ⇾ TSX), но это уже другая тема…
Почему стоит писать на TS при работе с Angular2 ?
33
Почему стоит писать на TS при работе с Angular2
34
• Потому, что разработчики Angular2 советуют
Почему стоит писать на TS при работе с Angular2
35
• Потому, что разработчики Angular2 советуют
• Все примеры в документации на TS
Почему стоит писать на TS при работе с Angular2
36
• Потому, что разработчики Angular2 советуют
• Все примеры в документации на TS
• Синтаксис декораторов расширен!
Почему стоит писать на TS при работе с Angular2
37
• Потому, что разработчики Angular2 советуют
• Все примеры в документации на TS
• Синтаксис декораторов расширен
• Сам Angular2 написан на TS!
Сложности при работе с TS?
38
Сложности при работе с TS?
39
Есть…
Сложности при работе с TS?
40
Они все решаемы!
Сложности при работе с TS?
41
• Многословен
Сложности при работе с TS?
42
• Многословен
• Бывают сложности с составными типами и генериками
Сложности при работе с TS?
43
• Многословен
• Бывают сложности с составными типами и генериками
• Интерфейсы становятся бесполезными, если их не
поддерживать
Сложности при работе с TS?
44
• Многословен
• Бывают сложности с составными типами и генериками
• Интерфейсы становятся бесполезными, если их не
поддерживать
• Бывают сложности со сторонними JS пакетами
Сложности при работе с TS?
45
• Многословен
• Бывают сложности с составными типами и генериками
• Интерфейсы становятся бесполезными, если их не
поддерживать
• Бывают сложности со сторонними JS пакетами
• Не все фичи ES.Next транспилируются в ES5 (в
версии 2.0 …)
tsc -t ES2015 ⇾ Babel = Double compile
46
Сложности при работе с TS?
47
• Многословен
• Бывают сложности с составными типами и генериками
• Интерфейсы становятся бесполезными, если их не
поддерживать
• Бывают сложности со сторонними JS пакетами
• Не все фичи ES.Next транспилируются в ES5 (в
версии 2.0 …)
• Были сложности с импортом интерфейсов
(дублирование)
Сложности при работе с TS?
48
• Многословен
• Бывают сложности с составными типами и генериками
• Интерфейсы становятся бесполезными, если их не
поддерживать
• Бывают сложности со сторонними JS пакетами
• Не все фичи ES.Next транспилируются в ES5 (в
версии 2.0 …)
• Были сложности с импортом интерфейсов
(дублирование)
• Могут появиться новые… Но они все решаются!
@декораторы
49
Аннотации и вот это вот всё…
Hello world Angular2
50
import { Component } from '@angular/core';
@Component({ // магия детектед
selector: 'my-app',
template: '<h1>My First {{title}}</h1>'
})
export class AppComponent {
title :string = 'Angular App';
// где логика? Почему класс пустой?
}
ES DECOR@TOR
51
Принимает
 target
 key
 descriptor | index
Может возвращать
 function Decorator (target, name, [descriptor|index] )
 descriptor
 void
@ ИСПОЛЬЗУЕТСЯ ДЛЯ
52
 Декорирования
 Аннотирования
МОЖНО @
53
 Классы @decorate class A {}
 Методы class A { @decorate foo(){} }
 Свойства class A { @decorate foo = 1; }
 Accessors class A { @dcrt get foo(){ … }}
 Аргументы* class A { foo(@annotate a){} }
ДЕКОРАТОР КЛАССА
54
 target - конструктор класса
 return - новый конструктор или ничего
declare type ClassDecorator = <T extends Function>(target
:T) => T| void;
ДЕКОРАТОР КЛАССА
55
// пример
@Component
class MyComponent {
public template :string = '<h1>Hello, people!</h1>';
}
function Component(target) {
let metadata = { style: "...", selector: "main-app" };
Reflect.defineMetadata('annotations', [ metadata ], target);
}
ДЕКОРАТОР МЕТОДА
56
declare type MethodDecorator =
<T>(
target :Object,
propertyKey :string | symbol,
descriptor :TypedPropertyDescriptor<T>
) => TypedPropertyDescriptor<T> | void;
ДЕКОРАТОР МЕТОДА
57
function methodDecorator(target, propertyKey, descriptor) {
return descriptor;
}
Простым ES языком
 target - ссылка на prototype класса
 key - имя метода
 descriptor = Object.getOwnPropertyDescriptor
 return - ничего или дескриптор
ДЕКОРАТОР МЕТОДА
58
// пример
@Component({…})
class MyComponent {
@HostBinding('window:scroll') onScroll(event){
... }
}
ДЕКОРАТОР МЕТОДА ДОСТУПА (ACCESSORS)
59
Аналогично методу. Следует применять к первому методу
доступа (get или set), в порядке объявления.
class Line {
private _start :Point;
@strictType set start(v :Point) { this._start = v }
get start() { return this._start }
}
ДЕКОРАТОР СВОЙСТВА
60
declare type PropertyDecorator =
(target :Object, property :string|symbol) =>
void;
// ES реализация вышеописанного заклинания
function PropertyDecorator (target, property) { ... }
 target - ссылка на prototype класса
 key - имя свойства
 return – null или дескриптор свойства
ДЕКОРАТОР СВОЙСТВА
61
// пример
class TodoComponent {
@readonly readonly public foo :string;
@Input() bar;
@Output() getBar = new EventEmitter();
// …
}
ДЕКОРАТОР AННОТАТОР ПАРАМЕТРА
62
declare type ParameterDecorator =
(target :Object, key :string|symbol, index :number)
=> void;
• target - ссылка на prototype класса
• key - имя метода или undefined
• index - номер аргумента
• return - ничего
ДЕКОРАТОР AННОТАТОР ПАРАМЕТРА
63
// пример
import { Optional } from '@angular/core';
@Component({…})
export class InjectorComponent {
constructor( @Optional() private logger: Logger ) {
if (this.logger) this.logger.log(some_message);
}
}
DECORATOR FACTORY
64
function Factory(...params){
// do anything with params
return function Decorator(target :Object, key
:string|symbol, descriptor?) {
// decorate or annotate target
// or return descriptor
// or return void
}
}
ФАБРИЧНЫЙ ДЕКОРАТОР
65
import { Component } from '@angular/core';
@Component({ // магии нет
selector: 'my-app',
template: '<h1>My First {{title}}</h1>'
})
export class AppComponent {
protected title :string = 'Angular App';
}
ДЕКОРАТОРЫ В ANGULAR2
66
 @NgModule
 @Component
 @Directive
 @Pipe
 @Injectable
 @Input
 @Output
 …
 @HostBinding
 @HostListener
 @ContentChild
 @ContentChildren
 @ViewChild
 @ViewChildren
 @Optional
 …
А ЕЩЕ ДОБАВИТЬ CORE-DECORATORS.JS
67
 @readonly
 @nonconfigurable
 @nonenumerable
 @lazyInitialize
 @autobind
 @deprecate
 @suppressWarnings
 @enumerable
 @override
 @debounce
 @throttle
 @time
 @decorate
 @mixin
Библиотека готовых декораторов
БУДУЩЕЕ JAVASCRIPT 
68
@Component({ selector: 'myapp' })
@View({ template: 'mytemplate' })
@log @lorem @ipsum @dolor @sit @amet @consectetur
class SomeClass {
@readonly @deprecated @memoize @enumerable
@_if(User.login) @log
@merge( function mergedFunc(){...} )
action(@log @Inject() config, name) {
...
}
}
REFLECT METADATA API
69
70
Refelect
 Reflect.apply()
 Reflect.construct()
 Reflect.defineProperty()
 Reflect.deleteProperty()
 Reflect.enumerate()
 Reflect.get()
 Reflect.getOwnPropertyDescriptor()
 Reflect.getPrototypeOf()
 Reflect.has()
 Reflect.isExtensible()
 Reflect.ownKeys()
 Reflect.preventExtensions()
 Reflect.set()
 Reflect.setPrototypeOf()
71
reflect-metadata
Polyfill for Metadata Reflection API. Proposal to add Decorators to ES.Next, along
with a prototype for an ES.Next Reflection API for Decorator Metadata
 Reflect.defineMetadata()
 Reflect.hasMetadata()
 Reflect.hasOwnMetadata()
 Reflect.getMetadata()
npm install --save reflect-metadata
 Reflect.getOwnMetadata()
 Reflect.getMetadataKeys()
 Reflect.getOwnMetadataKeys()
 Reflect.deleteMetadata()
72
Reflect Metadata API in TypeScript
tsconfig.json:
{
"compilerOptions": {
"target": "ES5",
"experimentalDecorators": true,
"emitDecoratorMetadata": true
}
}
73
Reflect Metadata API пример
class Point {constructor(
public x :number,
public y :number
){}}
class Line {
private _start :Point;
private _stop :Point;
set start(v :Point) { this._start = v }
get start() { return this._start }
set stop(v :Point) { this._stop = v }
get stop() { return this._stop }
}
let foo = new Line;
foo.start = new Point(1,1);
foo.stop = new Point(9,9);
// или
let bar = new Line;
bar.start = { x: 1, y: 1 };
bar.stop = { x: 1, y: 1 };
74
Reflect Metadata API пример
function strictType<T>(t :any, k :string, d :TypedPropertyDescriptor<T>) :never|void {
d.set = (value :T) :never|void => {
let type = Reflect.getMetadata("design:type", t, k);
if (!(value instanceof type))
throw new TypeError("Invalid type!");
}
}
Декоратор
75
Reflect Metadata API пример
class Point {constructor(
public x :number,
public y :number
){}}
class Line {
private _start :Point;
private _stop :Point;
@strictType set start(v :Point) {
this._start = v }
get start() { return this._start }
@strictType set stop(v :Point) { this._stop
= v }
get stop() { return this._stop }
let foo = new Line;
foo.start = new Point(1,1);
foo.stop = new Point(9,9);
// или
let bar = new Line;
bar.start = { x: 1, y: 1 }; // Throw
error (!)
bar.stop = { x: 1, y: 1 }; // Throw
error (!)
Ссылки по теме
76
https://goo.gl/dYFfrl
Александр Майоров
 twitter, github: @frontdevops
 medium: @frontman
 alexander@majorov.su
 mayorov@tutu.ru
Developer advocate & technical evangelist in
Tutu.ru
77
Спасибо! Вопросы?
https://goo.gl/dYFfrl
HOLY WAR
78
Как лучше писать аннотации типов?
79
Как лучше писать аннотации типов?
let Trump :{
foo
:string;
bar :any;
} = {
foo:
"abc";
bar: 123;
};
let Hillary: {
foo:
string;
bar:
any;
} = {
foo:
"abc";
bar:
123;
};
¯_(ツ)_/¯
let Truhilla : {
foo :
string;
bar :
any;
} = {
foo :
"abc";
bar :
123;
};
80
Голосование
Трамп или Хилари?

More Related Content

PDF
Никита Цуканов - "Avalonia UI Cross-platform Open Source UI Framework"
PDF
Особенности тестирования открытого ПО
PPTX
Solit 2013, Советы по написанию кода: именование, массивы и перечисления, Вор...
PDF
Встраивание Python в мобильные приложения – нюансы interoperation, новые подх...
PPTX
Why does code style matter?
PDF
Статический анализ кода для верификации 64-битных приложений
PDF
Kranonit s16 (python). sergey burma
PPTX
SECON'2016. Чубарь Алексей, Мобильные грабли Unity
Никита Цуканов - "Avalonia UI Cross-platform Open Source UI Framework"
Особенности тестирования открытого ПО
Solit 2013, Советы по написанию кода: именование, массивы и перечисления, Вор...
Встраивание Python в мобильные приложения – нюансы interoperation, новые подх...
Why does code style matter?
Статический анализ кода для верификации 64-битных приложений
Kranonit s16 (python). sergey burma
SECON'2016. Чубарь Алексей, Мобильные грабли Unity

Similar to Фишки и прелести TypeScript (18)

PDF
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
PDF
"Портирование Web SDK с JS на TS" Петров Григорий, Voximplant
PPTX
Разработка веб-приложений с помощью TypeScript
PPTX
TypeScript
PPTX
CodeFest 2014. Пугачев С. — Язык TypeScript или JavaScript на стероидах
PDF
Angular 2 On Production
PDF
JavaScript завтра / Сергей Рубанов (Exante Limited)
PDF
JavaScript завтра
PPTX
Ciklum .NET Saturday - Introduction to TypeScript
PDF
JavaScript. OOP (in russian)
PPTX
NetworkUA - 2012 - Introduction TypeScript
PPTX
Tech talk Angular 2
PDF
Angular2
PPTX
Dot.net building scalable java script application using react and typescript,...
PDF
Компонентная разработка на Stylus, Jade, Typescript - Леонид Ширманов
PDF
JavaScript. Basics (in russian)
PPTX
Angular vs Angular 2 vs React. Сергей Александров
PDF
Обзор ES2015(ES6)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
"Портирование Web SDK с JS на TS" Петров Григорий, Voximplant
Разработка веб-приложений с помощью TypeScript
TypeScript
CodeFest 2014. Пугачев С. — Язык TypeScript или JavaScript на стероидах
Angular 2 On Production
JavaScript завтра / Сергей Рубанов (Exante Limited)
JavaScript завтра
Ciklum .NET Saturday - Introduction to TypeScript
JavaScript. OOP (in russian)
NetworkUA - 2012 - Introduction TypeScript
Tech talk Angular 2
Angular2
Dot.net building scalable java script application using react and typescript,...
Компонентная разработка на Stylus, Jade, Typescript - Леонид Ширманов
JavaScript. Basics (in russian)
Angular vs Angular 2 vs React. Сергей Александров
Обзор ES2015(ES6)
Ad

Фишки и прелести TypeScript

  • 1. TypeScript Это не больно, даже прикольно 1 Александр Майоров Tutu.ru
  • 2. Александр Майоров  twitter, github: @frontdevops  alexander@majorov.su  mayorov@tutu.ru Developer advocate & technical evangelist in Tutu.ru 2
  • 3. 276сотрудников 500 тыс.посетителей в день 2003 г.год основания Мы продаем туры, ж/д и авиабилеты, билеты на автобусы, бронируем отели, рассказываем о расписании. 15 млнпосетителей в месяц Самый посещаемый сервис туристических услуг в России (по результатам исследования comScore). 3
  • 6. Опасения при выборе TypeScript  Можно писать только ООП код (нет) 6
  • 7. Опасения при выборе TypeScript  Можно писать только ООП код (нет)  Обязательно использовать типы 7
  • 8. Опасения при выборе TypeScript  Можно писать только ООП код (нет)  Обязательно использовать типы  Другой язык (holy war) 8
  • 9. Опасения при выборе TypeScript  Можно писать только ООП код (нет)  Обязательно использовать типы  Другой язык (holy war)  Плохая поддержка в IDE (bullshit) 9
  • 10. Опасения при выборе TypeScript  Можно писать только ООП код (нет)  Обязательно использовать типы  Другой язык (holy war)  Плохая поддержка в IDE (bullshit)  Нужно все переписывать в TS с JS (no) 10
  • 11. Опасения при выборе TypeScript  Можно писать только ООП код (нет)  Обязательно использовать типы  Другой язык (holy war)  Плохая поддержка в IDE (bullshit)  Нужно все переписывать в TS с JS (no)  Babel умеет больше, развивается быстрее. А для типов есть Flow (holy war) 11
  • 13. Факты про TypeScript  TS – это JavaScript 13
  • 14. Факты про TypeScript  TS – это JavaScript 14 class A { static buz = 'Some buz'; } class B extends A { constructor(foo, bar) { super(); this.foo = foo; this.bar = bar; } getFooWithBar(){ return [ this.foo , this.bar ] } }
  • 15. Факты про TypeScript  TS – это JavaScript  Текущая версия 2.0.10 и уже готов RC 2.1 (!) 15 ( Angular тоже 2 – совпадение?  )
  • 16. Факты про TypeScript  TS – это JavaScript  Текущая версия 2.0.10 и уже готов RC 2.1  Строгая типизация опциональна 16
  • 17. Факты про TypeScript  TS – это JavaScript  Текущая версия 2.0.10 и уже готов RC 2.1  Строгая типизация опциональна  Развитые инструменты для работы в ООП стиле 17
  • 18. Факты про TypeScript  TS – это JavaScript  Текущая версия 2.0.10 и уже готов RC 2.1  Строгая типизация опциональна  Развитые инструменты для работы в ООП стиле  Режимы (таргеты) транспилирования: ES3, ES5, ES2015… 18
  • 19. Факты про TypeScript  TS – это JavaScript  Текущая версия 2.0.10 и уже готов RC 2.1  Строгая типизация опциональна  Развитые инструменты для работы в ООП стиле  Режимы транспилирования: ES3, ES5, …  Поддержка разных модульных систем (ES modules, Commonjs, AMD, …) 19
  • 20. Факты про TypeScript  TS – это JavaScript  Текущая версия 2.0.10 и уже готов RC 2.1  Строгая типизация опциональна  Развитые инструменты для работы в ООП стиле  Режимы транспилирования: ES3, ES5, …  Поддержка разных модульных систем  Делается MS, но код открыт и он на Github 20
  • 21. Факты про TypeScript  TS – это JavaScript  Текущая версия 2.0.10 и уже готов RC 2.1  Строгая типизация опциональна  Развитые инструменты для работы в ООП стиле  Режимы транспилирования: ES3, ES5, …  Поддержка разных модульных систем  Делается MS, но код открыт, он на Github  TS – это диалект JS (лолшто, а как же пункт 1 ?) 21
  • 22. Факты про TypeScript  TS – это диалект JS 22 const enum Flag { A = 1, B, C } interface IA { buz :Flag } abstract class A<T extends Object> implements IA { static protected readonly buz :Flag|string = Flag.B; } export default class B<T> extends A<T> { constructor(public foo :T|null, public bar :T|null){ super(); let num :number = parseInt(foo as string); } getFooWithBar(...a :Array<T>) :T[] { return [ this.foo , this.bar, ...a ] } }
  • 23. Факты про TypeScript  TS – это JavaScript  Текущая версия 2.0.3  Строгая статическая типизация опциональна  Развитые инструменты для работы в ООП стиле  Режимы транспилирования: ES3, ES5, ES6, …  Поддержка разных модульных систем  Делается MS, но код открыт, он на Github  TS – это диалект JS  На TS можно писать в ФП стиле 23
  • 24. Почему стоит писать на TS при работе с Angular2 24 ? НЛО прилетело и удалило слайд, пыщь пыщь
  • 25. Почему стоит писать на TS при работе с Angular2 25 • П  ТОМУ, что гладиолус…
  • 26. Почему стоит писать на TS вообще? 26
  • 27. Почему стоит писать на TS вообще 27  Отлов некоторых ошибок уже на стадии компиляции
  • 28. Почему стоит писать на TS вообще 28  Отлов некоторых ошибок уже на стадии компиляции  Удобно рефакторить, легче отыскивать breaking changes
  • 29. Почему стоит писать на TS вообще 29  Отлов некоторых ошибок уже на стадии компиляции  Удобно рефакторить, легче отыскивать breaking changes  Самодокументируемый код (интерфейсы и не только)
  • 30. Почему стоит писать на TS вообще 30  Отлов некоторых ошибок уже на стадии компиляции  Удобно рефакторить, легче отыскивать breaking changes  Самодокументируемый код, контракты через интерфейсы  Gradual typings: не требуется указывать типы, но всегда можно добавить
  • 31. Почему стоит писать на TS вообще 31  Отлов некоторых ошибок уже на стадии компиляции  Удобно рефакторить  Самодокументируемый код, контракты через интерфейсы  Gradual typings: не требуется указывать типы, но всегда можно добавить  Хорошая навигация по коду и поддержка в IDE
  • 32. Почему стоит писать на TS вообще 32  Отлов некоторых ошибок уже на стадии компиляции  Удобно рефакторить  Самодокументируемый код, контракты через интерфейсы  Gradual typings: не требуется указывать типы, но всегда можно добавить  Хорошая навигация по коду и поддержка в IDE  Если вы поклонник ООП – есть все инструменты для ООП • Бэкендеры PHP, C#, Java, etc … могут понять ваш код и даже дописать что-то • Он умеет даже React (JSX ⇾ TSX), но это уже другая тема…
  • 33. Почему стоит писать на TS при работе с Angular2 ? 33
  • 34. Почему стоит писать на TS при работе с Angular2 34 • Потому, что разработчики Angular2 советуют
  • 35. Почему стоит писать на TS при работе с Angular2 35 • Потому, что разработчики Angular2 советуют • Все примеры в документации на TS
  • 36. Почему стоит писать на TS при работе с Angular2 36 • Потому, что разработчики Angular2 советуют • Все примеры в документации на TS • Синтаксис декораторов расширен!
  • 37. Почему стоит писать на TS при работе с Angular2 37 • Потому, что разработчики Angular2 советуют • Все примеры в документации на TS • Синтаксис декораторов расширен • Сам Angular2 написан на TS!
  • 39. Сложности при работе с TS? 39 Есть…
  • 40. Сложности при работе с TS? 40 Они все решаемы!
  • 41. Сложности при работе с TS? 41 • Многословен
  • 42. Сложности при работе с TS? 42 • Многословен • Бывают сложности с составными типами и генериками
  • 43. Сложности при работе с TS? 43 • Многословен • Бывают сложности с составными типами и генериками • Интерфейсы становятся бесполезными, если их не поддерживать
  • 44. Сложности при работе с TS? 44 • Многословен • Бывают сложности с составными типами и генериками • Интерфейсы становятся бесполезными, если их не поддерживать • Бывают сложности со сторонними JS пакетами
  • 45. Сложности при работе с TS? 45 • Многословен • Бывают сложности с составными типами и генериками • Интерфейсы становятся бесполезными, если их не поддерживать • Бывают сложности со сторонними JS пакетами • Не все фичи ES.Next транспилируются в ES5 (в версии 2.0 …)
  • 46. tsc -t ES2015 ⇾ Babel = Double compile 46
  • 47. Сложности при работе с TS? 47 • Многословен • Бывают сложности с составными типами и генериками • Интерфейсы становятся бесполезными, если их не поддерживать • Бывают сложности со сторонними JS пакетами • Не все фичи ES.Next транспилируются в ES5 (в версии 2.0 …) • Были сложности с импортом интерфейсов (дублирование)
  • 48. Сложности при работе с TS? 48 • Многословен • Бывают сложности с составными типами и генериками • Интерфейсы становятся бесполезными, если их не поддерживать • Бывают сложности со сторонними JS пакетами • Не все фичи ES.Next транспилируются в ES5 (в версии 2.0 …) • Были сложности с импортом интерфейсов (дублирование) • Могут появиться новые… Но они все решаются!
  • 50. Hello world Angular2 50 import { Component } from '@angular/core'; @Component({ // магия детектед selector: 'my-app', template: '<h1>My First {{title}}</h1>' }) export class AppComponent { title :string = 'Angular App'; // где логика? Почему класс пустой? }
  • 51. ES DECOR@TOR 51 Принимает  target  key  descriptor | index Может возвращать  function Decorator (target, name, [descriptor|index] )  descriptor  void
  • 52. @ ИСПОЛЬЗУЕТСЯ ДЛЯ 52  Декорирования  Аннотирования
  • 53. МОЖНО @ 53  Классы @decorate class A {}  Методы class A { @decorate foo(){} }  Свойства class A { @decorate foo = 1; }  Accessors class A { @dcrt get foo(){ … }}  Аргументы* class A { foo(@annotate a){} }
  • 54. ДЕКОРАТОР КЛАССА 54  target - конструктор класса  return - новый конструктор или ничего declare type ClassDecorator = <T extends Function>(target :T) => T| void;
  • 55. ДЕКОРАТОР КЛАССА 55 // пример @Component class MyComponent { public template :string = '<h1>Hello, people!</h1>'; } function Component(target) { let metadata = { style: "...", selector: "main-app" }; Reflect.defineMetadata('annotations', [ metadata ], target); }
  • 56. ДЕКОРАТОР МЕТОДА 56 declare type MethodDecorator = <T>( target :Object, propertyKey :string | symbol, descriptor :TypedPropertyDescriptor<T> ) => TypedPropertyDescriptor<T> | void;
  • 57. ДЕКОРАТОР МЕТОДА 57 function methodDecorator(target, propertyKey, descriptor) { return descriptor; } Простым ES языком  target - ссылка на prototype класса  key - имя метода  descriptor = Object.getOwnPropertyDescriptor  return - ничего или дескриптор
  • 58. ДЕКОРАТОР МЕТОДА 58 // пример @Component({…}) class MyComponent { @HostBinding('window:scroll') onScroll(event){ ... } }
  • 59. ДЕКОРАТОР МЕТОДА ДОСТУПА (ACCESSORS) 59 Аналогично методу. Следует применять к первому методу доступа (get или set), в порядке объявления. class Line { private _start :Point; @strictType set start(v :Point) { this._start = v } get start() { return this._start } }
  • 60. ДЕКОРАТОР СВОЙСТВА 60 declare type PropertyDecorator = (target :Object, property :string|symbol) => void; // ES реализация вышеописанного заклинания function PropertyDecorator (target, property) { ... }  target - ссылка на prototype класса  key - имя свойства  return – null или дескриптор свойства
  • 61. ДЕКОРАТОР СВОЙСТВА 61 // пример class TodoComponent { @readonly readonly public foo :string; @Input() bar; @Output() getBar = new EventEmitter(); // … }
  • 62. ДЕКОРАТОР AННОТАТОР ПАРАМЕТРА 62 declare type ParameterDecorator = (target :Object, key :string|symbol, index :number) => void; • target - ссылка на prototype класса • key - имя метода или undefined • index - номер аргумента • return - ничего
  • 63. ДЕКОРАТОР AННОТАТОР ПАРАМЕТРА 63 // пример import { Optional } from '@angular/core'; @Component({…}) export class InjectorComponent { constructor( @Optional() private logger: Logger ) { if (this.logger) this.logger.log(some_message); } }
  • 64. DECORATOR FACTORY 64 function Factory(...params){ // do anything with params return function Decorator(target :Object, key :string|symbol, descriptor?) { // decorate or annotate target // or return descriptor // or return void } }
  • 65. ФАБРИЧНЫЙ ДЕКОРАТОР 65 import { Component } from '@angular/core'; @Component({ // магии нет selector: 'my-app', template: '<h1>My First {{title}}</h1>' }) export class AppComponent { protected title :string = 'Angular App'; }
  • 66. ДЕКОРАТОРЫ В ANGULAR2 66  @NgModule  @Component  @Directive  @Pipe  @Injectable  @Input  @Output  …  @HostBinding  @HostListener  @ContentChild  @ContentChildren  @ViewChild  @ViewChildren  @Optional  …
  • 67. А ЕЩЕ ДОБАВИТЬ CORE-DECORATORS.JS 67  @readonly  @nonconfigurable  @nonenumerable  @lazyInitialize  @autobind  @deprecate  @suppressWarnings  @enumerable  @override  @debounce  @throttle  @time  @decorate  @mixin Библиотека готовых декораторов
  • 68. БУДУЩЕЕ JAVASCRIPT  68 @Component({ selector: 'myapp' }) @View({ template: 'mytemplate' }) @log @lorem @ipsum @dolor @sit @amet @consectetur class SomeClass { @readonly @deprecated @memoize @enumerable @_if(User.login) @log @merge( function mergedFunc(){...} ) action(@log @Inject() config, name) { ... } }
  • 70. 70 Refelect  Reflect.apply()  Reflect.construct()  Reflect.defineProperty()  Reflect.deleteProperty()  Reflect.enumerate()  Reflect.get()  Reflect.getOwnPropertyDescriptor()  Reflect.getPrototypeOf()  Reflect.has()  Reflect.isExtensible()  Reflect.ownKeys()  Reflect.preventExtensions()  Reflect.set()  Reflect.setPrototypeOf()
  • 71. 71 reflect-metadata Polyfill for Metadata Reflection API. Proposal to add Decorators to ES.Next, along with a prototype for an ES.Next Reflection API for Decorator Metadata  Reflect.defineMetadata()  Reflect.hasMetadata()  Reflect.hasOwnMetadata()  Reflect.getMetadata() npm install --save reflect-metadata  Reflect.getOwnMetadata()  Reflect.getMetadataKeys()  Reflect.getOwnMetadataKeys()  Reflect.deleteMetadata()
  • 72. 72 Reflect Metadata API in TypeScript tsconfig.json: { "compilerOptions": { "target": "ES5", "experimentalDecorators": true, "emitDecoratorMetadata": true } }
  • 73. 73 Reflect Metadata API пример class Point {constructor( public x :number, public y :number ){}} class Line { private _start :Point; private _stop :Point; set start(v :Point) { this._start = v } get start() { return this._start } set stop(v :Point) { this._stop = v } get stop() { return this._stop } } let foo = new Line; foo.start = new Point(1,1); foo.stop = new Point(9,9); // или let bar = new Line; bar.start = { x: 1, y: 1 }; bar.stop = { x: 1, y: 1 };
  • 74. 74 Reflect Metadata API пример function strictType<T>(t :any, k :string, d :TypedPropertyDescriptor<T>) :never|void { d.set = (value :T) :never|void => { let type = Reflect.getMetadata("design:type", t, k); if (!(value instanceof type)) throw new TypeError("Invalid type!"); } } Декоратор
  • 75. 75 Reflect Metadata API пример class Point {constructor( public x :number, public y :number ){}} class Line { private _start :Point; private _stop :Point; @strictType set start(v :Point) { this._start = v } get start() { return this._start } @strictType set stop(v :Point) { this._stop = v } get stop() { return this._stop } let foo = new Line; foo.start = new Point(1,1); foo.stop = new Point(9,9); // или let bar = new Line; bar.start = { x: 1, y: 1 }; // Throw error (!) bar.stop = { x: 1, y: 1 }; // Throw error (!)
  • 77. Александр Майоров  twitter, github: @frontdevops  medium: @frontman  alexander@majorov.su  mayorov@tutu.ru Developer advocate & technical evangelist in Tutu.ru 77 Спасибо! Вопросы? https://goo.gl/dYFfrl
  • 78. HOLY WAR 78 Как лучше писать аннотации типов?
  • 79. 79 Как лучше писать аннотации типов? let Trump :{ foo :string; bar :any; } = { foo: "abc"; bar: 123; }; let Hillary: { foo: string; bar: any; } = { foo: "abc"; bar: 123; }; ¯_(ツ)_/¯ let Truhilla : { foo : string; bar : any; } = { foo : "abc"; bar : 123; };

Editor's Notes

  • #4: Мы делаем высоконагруженный портал с множеством туристических сервисов. Основное наше направление - это продажа билетов. Мы даем возможность клиентам купить билет на любое путешествие! У нас большой IT отдел – почти 50% всего штата. В далеком 2013 году мы внедрили TypeScript и вот уже несколько лет пишем на этом языке
  • #5: У нас в компании почти все проекты написаны на TypeScript + React
  • #8: Мягкая типизация. Типы можно ставить, а можно нет
  • #9: Зависит от того, как вы пишите и какие возможности языка используете.
  • #10: Sublime, Atom, JetBrains IDE, MS Code
  • #12: Порог входа – важный аспект. React взлетел из за низкого порога входа (одна из составляющих). Так вот и с TS транспайлером все просто. Все работает из коробки
  • #17: Даже примеры на Angular2 написаны без аннотации типов
  • #18: Private protected даже overload (перегрузка объявлений функций)
  • #20: Мы в свое время взяли именно TS из-за AMD
  • #21: Когда-то мы делали форки для внутренних нужд и вносили правки в компилятор (к примеру меняли переносы строк (когда-то это было жестко windows стайл).
  • #22: Отличтя от ES: Аннотации типов (от примитивов до сложных составных типов и генериков) Нестандартные типы: enum, never Нестандартные операторы и конструкции (!, type cast, readonly …) Интерфейсы Надо писать .d.ts декларации
  • #23: Отличтя от ES: Аннотации типов (от примитивов до сложных составных типов и генериков) Нестандартные типы: enum, never Нестандартные операторы и конструкции (!, type cast, readonly …) Интерфейсы Надо писать .d.ts декларации И да, синтаксис отличается от Flow и несовместим на 100%
  • #24: А лучше даже комбинировать ООП подход с функциональным.
  • #26: Может ответить нетерпеливый заядлый фанат ТС, которого уже достали этим вопросом. Но я бы задал вопрос по другому.
  • #28: Кажется мелочь – но привыкаешь и это работает.
  • #29: Легче отыскивать breaking changes
  • #30: , контракты через интерфейсы
  • #32: Особенно круто работают подсказки
  • #34: Возвращаясь к нашему вопросу, так почему же стоит это делать?
  • #35: Если вам недостаточно предыдущих аргументов, то… Хотя сомнительный аргумент, согласен.
  • #36: При этом примеры в доках даны без типизации, на какую способен ТС, чтобы те кто пишет на ES могли так же читать доки и не писать 2 доки
  • #37: А вот это уже аргумент. Для тех, кто не знает TS , Ангуляр будет черной коробкой в которой ничего непонятно.
  • #38: Вы будете писать руками код, который за вас мог бы написать компилятор. Код будет менее читаемый (хотя это холиварное утверждение). Декораторы в Ангуляре используют полифил reflect-metada-api и там есть вещи, которые совместимы только с TS (советую заглянуть в исходники данного NPM модуля)
  • #39: Нужно писать больше кода Бывают сложности при работе со сложными составными типами и генериками Интерфейсы становятся бесполезными, если их не поддерживать (если код пишут раздолбаи) Иногда сложно использовать сторонние JS пакеты Проблемы со сторонними d.ts или их отсутствием Иногда требуется упрощать сторонние d.ts или даже исправлять Ошибки компиляции могут отнимать время (что хочет этот компилятор?) Пока нет поддержки некоторых нужных фич, транспилируемых в ES5 (с 2.1 все будет круче, даже async await) Бывают сложности с импортом интерфейсов (дублирование, etc) 2 дерева зависимостей (код и типы)
  • #40: Нужно писать больше кода Бывают сложности при работе со сложными составными типами и генериками Интерфейсы становятся бесполезными, если их не поддерживать (если код пишут раздолбаи) Иногда сложно использовать сторонние JS пакеты Проблемы со сторонними d.ts или их отсутствием Иногда требуется упрощать сторонние d.ts или даже исправлять Ошибки компиляции могут отнимать время (что хочет этот компилятор?) Пока нет поддержки некоторых нужных фич, транспилируемых в ES5 (с 2.1 все будет круче, даже async await) Бывают сложности с импортом интерфейсов (дублирование, etc) 2 дерева зависимостей (код и типы)
  • #41: Нужно писать больше кода Бывают сложности при работе со сложными составными типами и генериками Интерфейсы становятся бесполезными, если их не поддерживать (если код пишут раздолбаи) Иногда сложно использовать сторонние JS пакеты Проблемы со сторонними d.ts или их отсутствием Иногда требуется упрощать сторонние d.ts или даже исправлять Ошибки компиляции могут отнимать время (что хочет этот компилятор?) Пока нет поддержки некоторых нужных фич, транспилируемых в ES5 (с 2.1 все будет круче, даже async await) Бывают сложности с импортом интерфейсов (дублирование, etc) 2 дерева зависимостей (код и типы)
  • #42: Нужно писать больше кода Бывают сложности при работе со сложными составными типами и генериками Интерфейсы становятся бесполезными, если их не поддерживать (если код пишут раздолбаи) Иногда сложно использовать сторонние JS пакеты Проблемы со сторонними d.ts или их отсутствием Иногда требуется упрощать сторонние d.ts или даже исправлять Ошибки компиляции могут отнимать время (что хочет этот компилятор?) Пока нет поддержки некоторых нужных фич, транспилируемых в ES5 (с 2.1 все будет круче, даже async await) Бывают сложности с импортом интерфейсов (дублирование, etc) 2 дерева зависимостей (код и типы)
  • #43: Нужно писать больше кода Бывают сложности при работе со сложными составными типами и генериками Интерфейсы становятся бесполезными, если их не поддерживать (если код пишут раздолбаи) Иногда сложно использовать сторонние JS пакеты Проблемы со сторонними d.ts или их отсутствием Иногда требуется упрощать сторонние d.ts или даже исправлять Ошибки компиляции могут отнимать время (что хочет этот компилятор?) Пока нет поддержки некоторых нужных фич, транспилируемых в ES5 (с 2.1 все будет круче, даже async await) Бывают сложности с импортом интерфейсов (дублирование, etc) 2 дерева зависимостей (код и типы)
  • #44: Нужно писать больше кода Бывают сложности при работе со сложными составными типами и генериками Интерфейсы становятся бесполезными, если их не поддерживать (если код пишут раздолбаи) Иногда сложно использовать сторонние JS пакеты Проблемы со сторонними d.ts или их отсутствием Иногда требуется упрощать сторонние d.ts или даже исправлять Ошибки компиляции могут отнимать время (что хочет этот компилятор?) Пока нет поддержки некоторых нужных фич, транспилируемых в ES5 (с 2.1 все будет круче, даже async await) Бывают сложности с импортом интерфейсов (дублирование, etc) 2 дерева зависимостей (код и типы)
  • #45: Нужно писать больше кода Бывают сложности при работе со сложными составными типами и генериками Интерфейсы становятся бесполезными, если их не поддерживать (если код пишут раздолбаи) Иногда сложно использовать сторонние JS пакеты Проблемы со сторонними d.ts или их отсутствием Иногда требуется упрощать сторонние d.ts или даже исправлять Ошибки компиляции могут отнимать время (что хочет этот компилятор?) Пока нет поддержки некоторых нужных фич, транспилируемых в ES5 (с 2.1 все будет круче, даже async await) Бывают сложности с импортом интерфейсов (дублирование, etc) 2 дерева зависимостей (код и типы)
  • #46: Нужно писать больше кода Бывают сложности при работе со сложными составными типами и генериками Интерфейсы становятся бесполезными, если их не поддерживать (если код пишут раздолбаи) Иногда сложно использовать сторонние JS пакеты Проблемы со сторонними d.ts или их отсутствием Иногда требуется упрощать сторонние d.ts или даже исправлять Ошибки компиляции могут отнимать время (что хочет этот компилятор?) Пока нет поддержки некоторых нужных фич, транспилируемых в ES5 (с 2.1 все будет круче, даже async await) Бывают сложности с импортом интерфейсов (дублирование, etc) 2 дерева зависимостей (код и типы)
  • #47: Генераторы и async await. Но уже сейчас есть RC2.1 и к концу года нам уже не нужен будет Babel
  • #48: Нужно писать больше кода Бывают сложности при работе со сложными составными типами и генериками Интерфейсы становятся бесполезными, если их не поддерживать (если код пишут раздолбаи) Иногда сложно использовать сторонние JS пакеты Проблемы со сторонними d.ts или их отсутствием Иногда требуется упрощать сторонние d.ts или даже исправлять Ошибки компиляции могут отнимать время (что хочет этот компилятор?) Пока нет поддержки некоторых нужных фич, транспилируемых в ES5 (с 2.1 все будет круче, даже async await) Бывают сложности с импортом интерфейсов (дублирование, etc) 2 дерева зависимостей (код и типы)
  • #49: Нужно писать больше кода Бывают сложности при работе со сложными составными типами и генериками Интерфейсы становятся бесполезными, если их не поддерживать (если код пишут раздолбаи) Иногда сложно использовать сторонние JS пакеты Проблемы со сторонними d.ts или их отсутствием Иногда требуется упрощать сторонние d.ts или даже исправлять Ошибки компиляции могут отнимать время (что хочет этот компилятор?) Пока нет поддержки некоторых нужных фич, транспилируемых в ES5 (с 2.1 все будет круче, даже async await) Бывают сложности с импортом интерфейсов (дублирование, etc) 2 дерева зависимостей (код и типы)
  • #50: Декораторы — это невероятно круто. Они позволяют описывать мета информацию прямо в объявлении класса, группируя все в одном месте и избегая дублирования. Ужасно удобно. Однажды попробовав, вы уже никогда не согласитесь писать по-старому. Однако, несмотря на всю полезность, декораторы в TypeScript (заявлены также на стандарт) не так просты, как хотелось бы. Работа с ними требует навыков джедая, так как необходимо разбираться в объектной модели JavaScript (ну, вы поняли, о чем я), API несколько запутанный и, к тому же, еще не стабильный.
  • #52: Cтруктурный шаблон проектирования, предназначенный для динамического подключения дополнительного поведения к объекту. В общем случае, декоратор — это выражение, предваренное символом "@", которое возвращает функцию определенного вида (разного в каждом случае). Собственно, можно просто объявить такую функцию и использовать ее имя в качестве выражения декоратора Выражение, принимающее в качестве аргументов объект, имя и дескриптор декориуемого объекта. Может возвращать функцию, дескриптор, новый объект или ничего. Другими словами - Декоратор представляет собой функцию, которая может изменить поведение другой функции. Синтаксис декораторов расширяет возможности метапрограммирования.
  • #53: Декорирование для динамического подключения дополнительного поведения к объекту. Это гибкая альтернатива наследованию. Аннотации представляют собой некие метаданные, которые могут добавляться в объекты и семантически не влияют на него, но могут использоваться во время выполнения. Назовем такие функции – эт функции (символ @ - называется эт)
  • #54: Декорировать (предварять символом @) в TypeScript можно классы, методы, параметры метода, методы доступа свойства (accessors) и поля.
  • #57: К вопросу что это диалект. Узнать тут ES сложно. Скорее это какой-то C#
  • #59: Кстати, нельзя декорировать конструктор. Конструктор декорируется через декоратор класса.
  • #61: Если вернуть дескриптор, то он будет использован для вызова Object.defineProperty; однако, при подключении библиотеки reflect-metadata этого не происходит (это баг в reflect-metadata)
  • #64: Декораторы параметра обрабатываются в декораторах методов или классов, либо в какой-то логике, знающей о метадате. Нельзя подменить аргумент, можно указать что с ним делать. Здесь декораторы со скобками. Почему так – будет описано далее.
  • #68: Не только в ангуляр есть декораторы.
  • #69: Не только в ангуляр есть декораторы.
  • #71: Reflect - это встроенный объект, который позволяет создавать методы, перехватывающие  операции JavaScript. При этом методы называются так же, как и методы proxy handler`ов. Reflect - это не функциональный, а простой объект, он не является конструктором. Это просто неймспейс Необходимый инструмент при метапрограммировании
  • #72: Одной из интересных особенностей декораторов является возможность получать информацию о типе декорируемого свойства или параметра (скажем "спасибо" Angular, т.к. сделано было специально для него). Чтобы это заработало, нужно подключить библиотеку reflect-metadata, и включить опцию emitDecoratorMetadata. После этого для свойств, которые имеют хотя бы один декоратор, можно вызвать Reflect.getMetadata с ключем "design:type", и получить конструктор соответствующего типа. Обратите внимание что он нужен не только во время разработки, но и в продакшене. Не ставьте его в dev зависимости
  • #73: Одной из интересных особенностей декораторов является возможность получать информацию о типе декорируемого свойства или параметра (скажем "спасибо" Angular, т.к. сделано было специально для него). Чтобы это заработало, нужно подключить библиотеку reflect-metadata, и включить опцию emitDecoratorMetadata. После этого для свойств, которые имеют хотя бы один декоратор, можно вызвать Reflect.getMetadata с ключем "design:type", и получить конструктор соответствующего типа. В Ангуляре используется полифил, а TS умеет эффективно использовать этот полифил при компиляции. В итоге скомпилированный код содержит различные вызовы данного АПИ, позволяя в рантайме работать с метаданными
  • #74: Получить информацию о типах в рантайме Используется в Inject
  • #76: По сути так должен был работать язык AtScript и механизм RTTS (real time type system)