Новые фичи включают в себя:
- увеличение скорости для поэтапных сборок;
- вспомогательный тип
Omit
; - улучшенные проверки избыточных свойств в типах объединения;
- вывод типов для объединения конструкторов.
Увеличение скорости
С режимом сборки --incremental
последующие сборки выполняются быстрее, благодаря кэшированию ссылок, расположений файлов и других данных, связанных со сборкой.
Вспомогательный тип Omit
Вспомогательный тип Omit
позволяет создавать новые типы на основе существующих методом исключения некоторых свойств из исходного типа.
Например, тип Person
определен следующим кодом:
type Person = {
name: string;
age: number;
address: string;
};
Используя Omit
, создаем новый тип без свойства address:
type NewPerson = Omit<Person, "address">;
Это то же самое, что:
type NewPerson = {
name: string;
age: number;
}
Улучшенные проверки избыточных свойств в типах c объединением
До TypeScript 3.5 проверки избыточных свойств в некоторых случаях не замечали лишние свойства. В объединениях TypeScript разрешал свойство с тем же именем, что и у типа с объединением, но с типом, отличным от того, что задан в определении. Например:
type Person = {
name: string;
age: number;
};
type Address = {
address: string;
}
const person: Person | Address = {
name: 'Joe',
age: 1,
address: true
};
Мы можем задать address
для чего-то, не являющегося строкой, что, в общем-то, не должно быть разрешено.
Это исправлено в TypeScript 3.5. Сейчас address
должен быть строкой, поскольку он указан как строка.
Флаг —allowUmdGlobalAccess
На файлы глобальных объявлений UMD теперь можно ссылаться, используя параметр --allowUmdGlobalAccess
.
Это добавляет больше гибкости микшированию и сопоставлению библиотек сторонних производителей. Теперь глобальные переменные, объявленные библиотеками, можно использовать даже внутри модулей.
Умная проверка типа с объединением
До TypeScript 3.5 мы бы получили ошибку в определении и назначении переменной следующего типа объединения:
type Foo = { done: boolean, value: string }
type Bar =
| { done: false, value: string }
| { done: true, value: string };
declare let source: Foo;
declare let target: Bar;
target = source;
До 3.5 done
был бы распознан как обладающий литеральным типом со значением, а не булевым.
Теперь тип done
распознается как логический— может принимать значения только true
или false
.
Вывод типа высшего порядка из обобщенных конструкторов
Мы создаем обобщенные конструкторы с помощью следующей функции:
function composeConstructors<T, U, V>(
F: new (x: T) => U, G: new (y: U) => V): (x: T) => V {
return x => new G(new F(x))
}
TypeScript 3.5 может выводить типы T
, U
и V
из цепочки типов, сформированных в композиции.
Если у нас есть следующий код:
class Foo<T> {
value: T;
constructor(value: T) {
this.value = value;
}
}
class Bar<U> {
value: U;
constructor(value: U) {
this.value = value;
}
}
let f = composeConstructors(Foo, Bar);
let a = f('foo');
Мы видим, что у a
тип Bar<Foo<string>>
. Предыдущие версии показывали для a
тип Bar<{}>
.
Заключение
TypeScript 3.5 умнее и быстрее. Он может выводить типы, сформированные композицией конструкторов, проходя по цепочке композиции. Проверка избыточных свойств проводится для типов с объединением, чего не было в более ранних версиях.
Кроме того, мы получили флаг --allowUmdGlobalAccess
для запуска доступа глобальных переменных из UMD модулей.
И, наконец, вспомогательный тип Omit
для создания новых типов из существующих с удалением некоторых свойств.
Читайте также:
- Веселимся с Angular и трансформаторами в TypeScript
- Новые функции в TypeScript
- Как создать простую браузерную игру с помощью Phaser 3 и TypeScript
Перевод статьи John Au-Yeung: Great New Features Released in TypeScript 3.5