TypeScript
Эволюция
vs
 Революция
В начале был JavaScript

JavaScript Клевый !
- гибкий
- быстро учится
- неожиданно быстрый
- няшный
Text
Пока маленький...
Большой JS проект
(50 - 100 kloc)

- 
с этим можно жить
	- модули
- тесты
- фреймворки
 
- но неприятно
1995

Javascript
2015 (2017)

ES.next
Чего ждем
- Классы, Модули
- Синтаксический сахар
- Генераторы
А пока ждали
- RequireJS, Browserify
- -
- -
2009
 
            CofeScript
- Rails
- DropBox
- GitHub
http://coffeescript.org/
  function test(a,b){
    var c = a*b;
    return c;
  }
  var c = test(12, 24);Синтаксический Cахар
//лямбды
square = (x) -> x * x
//операторы
eat food for food in ['toast', 'br']
//классы
class Snake extends Animal
  move: ->
    alert "Slithering..."
    super 5Плюсы
- Действительно короче
- Совместим с Javascript кодом
- Много новых конструкций
Минусы
- Но не проще
- Генерит странный JS код
- Мало полезных конструкций
- Свой синтакс
- Не совместим с ES6
2011
 
            Dart
http://dartlang.org
  function test(a,b){
    var c = a*b;
    return c;
  }
  var c = test(12, 24);  int test(int a,int b){Размер имеет значение
2011
main() => print('Hello!');100kb
2012
20kb
2014
8 loc
Плюсы
- Типизированные данные
- Много полезных конструкций
- IDE в комплекте
Минусы
- Генерит очень странный JS код
- Несовместим с javascript
- Другой язык
Личный опыт
Они убили innerHTML
Очень неторопливый IDE ( Eclipse )
Приятный синтаксис
Не хватает гибкости javascripta
Встроенный пакетный менеджер
2012
 
            TypeScript
- Microsoft
http://typescriptlang.org
  function test(a,b){
    var c = a*b;
    return c;
  }
  var c = test(12, 24);Эволюция вместо революции
Любой JavaScript код - это валидный TypeScript
Полная совместимость со все что уже написано на JavaSctipr
Типы данных
var width = 6;
var height: number = 6;
function test(width, 
              height: number){
    ...
}
test(6, "a"); //errorТипы данных
interface Event {
    x : number;
    y : number;
    z?: number;
}
var c:Event = { x:1, y:2 };
var d:Event = { x:1, y:2, a:5 };
var e:Event = { x:1 }; //errorТипы данных
- Исчезают после компиляции в JS
- Полноценный автокомплит
- Рефакторинг
- Частичная замена Unit тестам
- Частичная замена документации
... а зачем оно надо ?

Типы и существующий Javascript
http://definitelytyped.org/
npm install tsd -g
tsd query bootstrapФункции
function add(x, y = "10"){
    return x+y;
}
function add(x, y?){
    return x + (y || 10);
}
function add(x, ...rest){
    return x + rest[0];
}
Функции
var card = {
  stack:array(52),
  getOne:function(){
    var i = Math.floor(Math.random() * 52)
    return this.stack[i];
  }
}
addEventListener("click", card.getOne);Функции
var card = {
  stack:array(52),
  getOne:() => {
    var i = Math.floor(Math.random() * 52)
    return this.stack[i];
  }
}
addEventListener("click", card.getOne);Классы vs Prototypes

Классы
class Greeter {
    greeting: string;
    constructor(message: string) {
        this.greet = message;
    }
    greet() {
        return "Hello, " + this.greet;
    }
}
var greeter = new Greeter("world");Классы в JS
var Greeter = (function(){
    function Greeter(message) {
        this.greet = message;
    }
    Greeter.prototype.greet = function(){
        return "Hello, " + this.greet;
    };
    return Greeter;
})();
var greeter = new Greeter("world");
Классы
class NewGreeter extends Greeter{
    private _isNew: bool;
    constructor(message: string) {
        super(message);
    }
    set isSuper(value: bool){
        this._isNew = value;
    }
    get isSuper() : bool{
        return this._isNew;
    }
}
Модули


Модули
---- check.ts ----
module check {
    export class StringCheck{
        isNice(s: string): { ... };
    }
}
---- logic.ts ----
import myCheck = require('check');
new myCheck.StringCheck();Модули в JS
define(
    ["require", "exports", 'check'],
    function(require, exports, myCheck) {
        new myCheck.StringCheck();
});
----- or -----
var myCheck = require('check');
new myCheck.StringCheck();Остались за кадром
Generics
function identity<T>(arg: T): T {
    return arg;
}
var myIdentity: {<T>(arg: T): T} = identity;Плюсы
- Надежность
- Документирование
- Рефакторинг
- Sublime, WebStorm, VS Express
- ES6 и правильный js
Минусы
Карма MicroSoft
Продукт X
50 000 loc
5 лет

Только JavaScript
Продукт X
Постепенное улучшение вместо польной переработки
- меняем .JS на .TS
- описываем используемые интерфейсы
- добавляем типы в методы
- выделяем классы
Размер имеет значение
10кб JavaScript
=>
11кб TypeScript
Compile
Uglify + Gzip
12кб Javascript
3кб Javascript
3кб Javascript
Плюсы
- Читабельный код
- Документация на халяву
- Меньше багов ( в разработке )
- Больше пишешь код, меньше проверяешь
Минусы
Ломка при возвращении к JS
Спасибо за внимание
Собственно и всё

TypeScript
By mkozhukh
TypeScript
- 3,726
 
   
   
  