Доступна финальная версия TypeScript 2.2

TypeScript logoВышла финальная версия TypeScipt 2.2. В этой версии был введен новый тип object (не путать с Object) и улучшена поддержка индексеров и компонуемых классов. Разберемся чуть подробнее, что скрывается за этими изменениями.

Что нового?

Тип object

Иногда в качестве параметра необходимо передать произвольный объект или null, но не примитивный тип.  Вариант с указанием Object | null не подойдет, т.к. в TypeScript number, string, boolean можно присвоить в переменную типа Object.

Для решения этой проблемы был введен тип object (все буквы строчные), которые является "не примитивным". Таким образом значения типа number, boolean, string, symbol, null и undefined не могут быть присвоены в переменную типа object.

Классы с примесями (mixins)

В TypeScript 2.2. были убраны некоторые ограничения, связанные с классами. Теперь появилась возможность создавать функции, которые:

  • получают в качестве параметра конструктор базового класса;
  • объявляют класс, который наследуется от базового;
  • добавляют поля в новый класс;
  • возвращают измененный класс

Таким образом результат является наследником базового класса, но с добавленными полями.

type Constructable = new (...args: any[]) => object;

function Tagged(Base: TBase) {
    return class extends Base {
        private _tag = "";
        get tag() {
            return this._tag;
        }

        set tag(value: string) {
            this._tag = value;
        }
    };
}

class Article {
    …
}

const TaggedArticle = Tagged(Article);

let a = new TaggedArticle();
a.tag = "test";

Строковые индексы

В TypeScript есть концепция index signatures. В новой версии их использование было упрощено:

interface Foo
{ 
    [prop: string]: string | number; 
}

declare const x: Foo; 

// Оба вызова корректные
const y1 = x["hello"]; 
const y2 = x.hello;

Это может быть полезно, например, при работе в JSON.

Новый режим react-native

В предыдущих версиях TypeScript флаг --jsx мог принимать 2 значения:

  • preserve, который оставляет JSX код как есть и создает .jsx файл;
  • react, для преобразования JSX в вызовы React.createElement и созания .js файла.

Новое значение react-native занимает промежуточное положение: JSX код не изменяется, но генерируется .js файл.

Поддержка new.target

В TypeScript 2.2 добавлена поддержка мета-свойства new.target. Оно позволяет в конструкторе объекта узнать, создается ли тип самого объекта или его наследника.

class A {
  constructor() {
    console.log(new.target.name);
  }
}

class B extends A {
    constructor() { super(); }
}

var a = new A(); // выведет "A"
var b = new B(); // выведет "B"

Как скачать?

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

npm install -g typescript@2.0

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