Вышла финальная версия TypeScript 2.0

TypeScript logo Стала доступна финальная версия TypeScipt 2.0. С ее появлением язык стал еще ближе к спецификации ECMAScript. Давайте посмотрим что появилось нового по сравнению с версией 1.8.

Что нового?

Упрощенная загрузка файлов определений

Теперь можно загружать файлы определений (.d.ts) сразу с библиотеками с помощью npm. Для этого необходимо выполнить следующую команду:

npm install -s @types/<имя библиотеки>

В результате будет установлена как указанная библиотека так и файлов определений для нее.

Ненулевые типы (Non-nullable Types)

В TypeScript 2.0 введены отдельные типы для null и undefined. Остальные типы по умолчанию считаются ненулевыми. Для использования null или undefined необходимо явно указать ” | null” или ” | undefined”. Например: number | null.

Поскольку это критические изменение, то для её активации существует флаг —strictNullChecks.

Контроль типов

Контроль типов был доработан для поддержки ненулевых типов.

Модификатор readonly

Теперь свойства можно отмечать как readonly (только для чтения):

class Person {
    readonly name: string; 

    constructor(name: string) {
        if (name.length < 1)
            throw new Error("Empty name!"); 
    
        this.name = name;
    }
}

// Следующая строчка выдаст ошибку
new Person("Daniel").name = "Dan";

Упрощенное определение модулей

Иногда необходимо просто объявить модуль, без уточнения его типов. Для этого обычно используется код вида:

declare module "foo" { var x: any; export = x; }

TypeScript 2.0 позволяет сократить этот код до

declare module "foo";

Кроме того, можно использовать шаблоны. Например после следующей строки TypeScript будет считать существующими все модули, начинающиеся с “foo/

declare module "foo/*";

Отмеченные союзы (Tagged Unions)

В TypeScript 2.0 улучшена возможность работы с отмеченными союзами (Tagged Unions). Таким именем называются типы, у которых существует свойство с одинаковым именем, но гарантированно уникальным значением для каждого типа. Если раньше для работы с ними приходилось использовать приведение типов, то теперь в нем нет необходимости. Например:

interface Circle {
    kind: "circle";
    radius: number;
}

interface Square {
    kind: "square";
    sideLength: number;
}

// Объявляем Tagged Union. 
type Shape = Circle | Square;

// Пример использования
function getArea(shape: Shape) {
    switch (shape.kind) {
        case "circle":
            // 'shape' тут имеет тип 'Circle' без приведения
            return Math.PI * shape.radius ** 2;

        case "square":
            // 'shape' тут имеет тип 'Square' без приведения
            return shape.sideLength ** 2;
    }
}

Как скачать?

Установить TypeScript 2.0 можно

npm install -g typescript@2.0