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 для создания нового типа из существующих типов с удаленными некоторыми свойствами.