Вышла финальная версия 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