TypeScript 2.0 RC

Языки  /  Новости TypeScript  /  Microsoft  /  Languages

Недавно прочитал про выход TypeScript 2.0 RC. Делюсь фичами, которые мне понравились:

Tagged Unions

Интереснейшая фишка, которая, в том числе, позволяет делать другие интересные фишки. Давайте посмотрим на примере.

interface Circle { kind: "circle"; radius: number; } interface Square { kind: "square"; sideLength: number; } type Shape = Circle | Square;

Ключевой момент здесь — поле kind, значение которого зафиксировано (за счёт строкового литерального типа) и разное для разных типов. Пока ничего экстраординарного. Однако, посмотрите на следующий блок кода, где TypeScript сам догадывается, какой тип используется для каждого кейса:

function getArea(shape: Shape) { switch (shape.kind) { case "circle": // 'shape' is a 'Circle' here. return Math.PI * shape.radius ** 2; case "square": // 'shape' is a 'Square' here. return shape.sideLength ** 2; } }

Неплохо?

Новые литеральные типы

В TypeScript 1.8 были добавлены строковые литеральные типы. Теперь можно сделать литеральными boolean, number и enum. Помимо таких забавных применений:

type Digit = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9; let nums: Digit[] = [1, 2, 4, 8]; // Error! '16' isn't a 'Digit'! nums.push(16);

Есть более интересные варианты. Давайте вспомним про tagged unions. Допустим, мы хотим возвращать либо экземпляр типа, либо причину ошибки. При этом, сохраняя проверку типов — основную ценность TypeScript по сравнению с обычным JavaScript.

interface Success { success: true; value: T; } interface Failure { success: false; reason: string; } type Result = Success | Failure;

Теперь, в зависимости от значения поля success, TypeScript будет автоматически выводить тип в подобных ситуациях:

declare function tryGetNumUsers(): Result; let result = tryGetNumUsers(); if (result.success === true) { // 'result' has type 'Success' console.log(`${result.value} users here`); } else { // 'result' has type 'Failure' console.error("Error fetching number of users!", result.reason); }

Резюме

Это, на мой взгляд, наиболее интересные нововведения в TypeScript 2.0 после беты. Полный список новых фич в TypeScript 2.0, разумеется, более впечатляющий.

Языки  /  Новости TypeScript  /  Microsoft  /  Languages