Type Script

Новые фичи включают в себя: 

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

Читайте также:


Перевод статьи John Au-Yeung: Great New Features Released in TypeScript 3.5