Parameter properties - скорочення TypeScript: модифікатор доступу в параметрі конструктора одночасно оголошує поле класу й присвоює йому значення.
class User {
constructor(
public readonly id: number,
private name: string,
) {}
}
// те саме, що
class User {
public readonly id: number;
private name: string;
constructor(id: number, name: string) {
this.id = id;
this.name = name;
}
}
Зручно й коротко - тому цей запис став популярним (Angular, NestJS, багато бекенд-коду на TypeScript).
Проблема: це не «лише типи». Більшість синтаксису TypeScript можна просто стерти - прибрати анотації, і лишиться коректний JavaScript. Parameter properties так не працюють: щоб отримати JavaScript, компілятор має згенерувати код (присвоєння this.id = id).
Те саме з enum (генерує об'єкт), namespace з виконуваним кодом і import x = require().
Чому це стало важливим:
- Node.js 22.18+/23.6+ виконує
.tsфайли напряму через «стирання типів» (type stripping) - без компіляції. Синтаксис, що потребує генерації коду, там не підтримується; - інструменти на кшталт швидких транспіляторів теж простіше працюють зі «стираним» синтаксисом.
Прапорець erasableSyntaxOnly (TypeScript 5.8+) забороняє такий синтаксис у проєкті - помилка компілятора «This syntax is not allowed when erasableSyntaxOnly is enabled»:
{ "compilerOptions": { "erasableSyntaxOnly": true } }
Чим замінювати:
- parameter properties - звичайні поля й присвоєння в конструкторі;
enum- об'єкт зas constі тип-об'єднання:
const Status = { Draft: 'draft', Published: 'published' } as const;
type Status = (typeof Status)[keyof typeof Status];
Практичний висновок: у новому коді, особливо для Node.js без збирання, варто вмикати erasableSyntaxOnly - тоді TypeScript-код лишається «JavaScript з анотаціями». Parameter properties не помилка, але прив'язують код до компіляції.