Авторы языка программирования TypeScript официально выпустили версию 4.6 Beta. Они улучшили функционал языка и добавили несколько серьёзных изменений. Скачать обновление можно через NuGet или npm:
npm install typescript@beta
Конструкторы теперь разрешают использовать произвольный код перед методом super (). Раньше такое поведение вызвало бы ошибку, но в обновлении решили эту проблему. Сейчас у разработчиков есть возможность более гибко пользоваться конструкторами.
TypeScript научился правильно делать выводы об индексах типов, которые ссылаются на методы объектов. Например, код ниже показывает, что вызов функции record.f (record.v) — корректный.
interface TypeMap {
"number": number;
"string": string;
"boolean": boolean;
}
type UnionRecord<P extends keyof TypeMap> = { [K in P]:
{
kind: K;
v: TypeMap[K];
f: (p: TypeMap[K]) => void;
}
}[P];
function processRecord<K extends keyof TypeMap>(record: UnionRecord<K>) {
record.f(record.v);
}
processRecord({
kind: "string",
v: "hello!",
// 'val' раньше бы имел неявный тип — 'string | number | boolean',
// но теперь это будет просто 'string'.
f: val => {
console.log(val.toUpperCase());
}
})
TypeScript исправляет проблему сравнения «бесконечно» вложенных типов. Код ниже в версиях языка 4.5 и меньше позволил бы сравнить две переменные x и y, потому что TypeScript проверяет вложенность только до определённого уровня. TypeScript 4.6 научился различать такие случаи и проверять «бесконечную» вложенность.
interface Foo<T> {
prop: T;
}
declare let x: Foo<Foo<Foo<Foo<Foo<Foo<string>>>>>>;
declare let y: Foo<Foo<Foo<Foo<Foo<string>>>>>;
x = y;
Релиз 4.6 добавляет новый функционал для сигнатур методов. Ниже представлена функция с неопределённым количеством аргументов, но с одним изменением. Если первый переданный аргумент — строка str, то следующим аргументом должна быть переменная типа string, или если первый аргумент — строка num, то следующим аргументом обязана быть переменная типа number.
function func(...args: ["str", string] | ["num", number]) {
// ...
}
Кроме этого, TypeScript 4.6 добавляет больше синтаксических и привязочных ошибок, trace analyzer, проверку JavaScript-файлов на грамматические и привязочные ошибки и многое другое.
Подробный список изменений можно посмотреть на официальном блоге TypeScript.