TypeScript улучшается с каждым днем. Мы продолжаем получать новые функции с каждым выпуском. В этой статье мы рассмотрим новые возможности, выпущенные с TypeScript 3.5.
Новые функции включают повышение скорости инкрементных сборок, новый вспомогательный тип Omit
, улучшенные проверки избыточных свойств в типах объединения и вывод типа для композиции конструкторов.
Улучшения скорости
В режиме сборки --incremental
последующие сборки выполняются быстрее из-за кэширования ссылок, местоположений файлов и других данных, связанных с сборкой.
Опустить тип помощника
Вспомогательный тип Omit
был введен в TypeScript 3.5, чтобы позволить нам создавать новый тип из существующих типов, исключая некоторые свойства из оригинала.
Например, учитывая тип Person
, определенный в следующем коде:
type Person = { name: string; age: number; address: string; };
Мы можем создать новый тип без свойства address
, используя Omit
:
type NewPerson = Omit<Person, "address">;
Это то же самое, что:
type NewPerson = { name: string; age: number; }
Улучшенная проверка избыточного имущества в типах Union
До TypeScript 3.5 избыточные проверки свойств в некоторых случаях не определяли свойства. Если у нас есть тип объединения, то версии TypeScript до 3.5 допускают свойство с тем же именем, что и тип типа объединения, но с типом, отличным от того, который указан в определении типа.
Например, если у нас есть:
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 теперь можно ссылаться в TypeScript 3.5 с помощью нового флага --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>>
. Версии до 3.5 имеют тип Bar<{}>
для a
.
TypeScript 3.5 стал умнее. Он может выводить типы, образованные композицией конструкторов.
С TypeScript 3.5 он умнее и быстрее. Он может вывести типы, образованные композицией конструкторов, пройдя по цепочке композиции.
Проверяются лишние проверки свойств для типов объединения, чего не было в более ранних версиях.
Также у нас есть флаг -- allowUmdGlobalAccess
для запуска доступа к глобальным переменным из модулей UMD.
Наконец, у нас есть тип Omit
для создания нового типа из существующих типов с удаленными некоторыми свойствами.