Релиз TypeScript 5.0 Beta
На днях вышел релиз мажорной версии TypeScript 5.0 Beta. В этом релизе много новых фич. Кратко о некоторых фичах релиза:
Новый стандарт декораторов
В TS уже были декораторы, и они были доступны под флагом. В версии 5.0 декораторы будут доступны без флага, а те декораторы, которые были доступны под флагом, объявлены как легаси. Пример использования новых декораторов:
function loggedMethod<This, Args extends any[], Return>(
target: (this: This, ...args: Args) => Return,
context: ClassMethodDecoratorContext<This, (this: This, ...args: Args) => Return>
) {
const methodName = String(context.name);
function replacementMethod(this: This, ...args: Args): Return {
console.log(`LOG: Entering method '${methodName}'.`)
const result = target.call(this, ...args);
console.log(`LOG: Exiting method '${methodName}'.`)
return result;
}
return replacementMethod;
}
class Person {
// --snip--
@bound
@loggedMethod
greet() {
console.log(`Hello, my name is ${this.name}.`);
}
}
Для работы с декораторами добавлен новый тип ClassMethodDecoratorContext, который моделирует объект контекста, который принимают декораторы метода.
У метода может быть несколько декораторов. В примере сначала выполнится @loggedMethod, а потом @bound.
Декораторы можно использовать не только у метода, но и у класса и его полей.
const как параметр типа
В TS есть утверждение as const, которое делает выражение иммутабельным и говорит компилятору, что тип больше не будет расширяться.
В TS 5.0 можно добавить const как модификатор к объявлению типа параметра. Пример:
type HasNames = { names: readonly string[] };
function getNamesExactly<const T extends HasNames>(arg: T): T["names"] {
return arg.names;
}
// readonly ["Alice", "Bob", "Eve"]
const names = getNamesExactly({ names: ["Alice", "Bob", "Eve"] });
При этом использование модификатора const не требует ограничения типа в виде readonly. Если не использовать readonly, то результат будет другим:
declare function fnBad<const T extends string[]>(args: T): void;
// 'T' будет 'string[]', а не 'readonly ["a", "b", "c"]'
fnBad(["a", "b" ,"c"]);
Несколько конфиг файлов в extends
Появилась возможность расширять tsconfig от несколько файлов:
{
"compilerOptions": {
"extends": ["a.json", "b.json", "c.json"]
}
}
В этом случае b.json расширяет a.json, а c.json расширяет b.json, а текущий конфиг расширяет c.json.
devblogs.microsoft.com/typescr…5-0-beta