TypeScript: новые возможности версии 1.7

TypeScript logoВместе с первым обновлением для Visual Studio была выпущен новая версия языка TypeScript. Среди нововведений поддержка async/await, полиморфный тип this и оператор для возведения в степень. Давайте посмотрим на эти возможности немного подробнее.

Где скачать?

Загрузить TypeScript 1.7 можно по следующим ссылкам:

Что нового?

Поддержка Async/Await при компиляции для ES6

В TypeScript появилась поддержка ключевых слов async/await. Выглядит это аналогично C#: создаваемые асинхронные функции отмечаются async, а вызовы других асинхронных функций – await. По сути, это обертка для более удобного использования Promise из ES6. Это позволяет писать асинхронный код в стиле синхронного, не создавая различные обработчики событий или callback функции.

Посмотрим на примере вывода текста в консоль с задержкой:

async function main() {
    await ping();
}

async function ping() {
    for (var i = 0; i < 10; i++) {
        await delay(300);
        console.log("Вызов " + i);
    }
}

function delay(ms: number) {
    return new Promise(resolve => setTimeout(resolve, ms));
}

main().then(() => { console.log("Завершено"); });

Необходимо учесть что данный код может быть скомпилирован только для ES6 (например для node.js v4 и выше). У разработчиков сейчас есть цель обеспечить совместимость async/await c браузерами, которые не поддерживают ES6.

Полиморфный тип this

Новый полиморфный тип this может быть использован в классах и интерфейсах для указания текущего типа. Это означает, что при наследовании this будет восприниматься в сигнатуре функции уже как тип наследника. Рассмотрим пример:

interface Model {
    setupBase(): this;
}
 
interface AdvancedModel extends Model {
    setupAdvanced(): this;
}
 
declare function createModel(): AdvancedModel;
var newModel = createModel().setupBase().setupAdvanced(); 

Как было сказано, при наследовании тип this начинает соответствовать типу наследника. Поэтому сигнатура setupBase() в AdvancedModel будет уже эквивалентна записи

setupBase(): AdvancedModel
Именно поэтому данный код скомпилируется без проблем. Но если в строке 2 заменить this на Model, то это приведет к ошибке. Причина этого проста – функция setupAdvanced() отсутствует в Model, а при такой записи setupBase() всегда будет возвращать тип Model.

Кстати, приведенный выше пример наглядно демонстрирует как this упрощает разработку fluent API.

Генерация модулей ES6

TypeScript 1.7 получил возможность указывать тип создаваемых модулей при генерации кода для ES6. Для этого необходимо задать флаг --module или определить его в tsconfig.json:

// tsconfig.json для node.js v4 и выше
{
    "compilerOptions": {
        "module": "commonjs",
        "target": "es6"
    }
}

Возведение в степень

Немного синтаксического сахара. Для возведения числа в степень появился оператор **. Например:

var value1 = 2 ** 3; // === 2 * 2 * 2
var value2 **= 2; // === value2 * value2. Обратите внимание на отсутствие пробела в **=

Как можно заметить, в итоговом JavaScript это будет заменено на вызов Math.pow().

Добавить комментарий