Avatar ·

Предупреждение "Experimental decorators" при компиляции TypeScript

Всем привет! Я только начал изучать TypeScript и столкнулся с непонятной проблемой. Я пишу простой класс с декоратором, но при компиляции получаю предупреждение: "Experimental support for decorators is a feature that is subject to change in a future release. Set the 'experimentalDecorators' option in your 'tsconfig.json' or 'jsconfig.json' to remove this warning." Вот мой код: ```typescript function log(target: any, key: string, descriptor: PropertyDescriptor) { const original = descriptor.value; descriptor.value = function(...args: any[]) { console.log(`Вызов метода ${key} с аргументами:`, args); return original.apply(this, args); }; return descriptor; } class Calculator { @log add(a: number, b: number): number { return a + b; } } const calc = new Calculator(); calc.add(2, 3); ``` Я использую Visual Studio Code и TypeScript версии 5.3.2. В файле tsconfig.json у меня только базовые настройки, ничего про декораторы я не добавлял. Код работает, но это предупреждение меня смущает — это ошибка? Мой код упадет в production? Как правильно настроить проект, чтобы избавиться от этого предупреждения? Или может быть есть другой способ писать декораторы без этого предупреждения? Заранее спасибо за помощь! <<>>

Почему возникает предупреждение и как его исправить

Это предупреждение — не ошибка, а напоминание от TypeScript о том, что декораторы всё ещё являются экспериментальной функцией. Они не входят в стабильный стандарт ECMAScript и могут измениться в будущих версиях. Ваш код будет работать в production, но вы рискуете, что после обновления TypeScript синтаксис декораторов может поменяться.

Основное решение: настройка tsconfig.json

Чтобы убрать предупреждение, нужно добавить опцию experimentalDecorators в файл tsconfig.json:

{
  "compilerOptions": {
    "target": "ES2021",
    "module": "commonjs",
    "strict": true,
    "experimentalDecorators": true,  // Включаем поддержку декораторов
    "emitDecoratorMetadata": true    // Опционально: для рефлексии метаданных
  },
  "include": ["src/**/*"]
}

После этого перезапустите компилятор (или перезагрузите VS Code) — предупреждение исчезнет.

Что делает experimentalDecorators

  • Разрешает использование декораторов классов, методов, свойств, параметров
  • Включает транспиляцию декораторов в JavaScript согласно старой proposal-спецификации
  • Без этой опции TypeScript выдаёт ошибку при встрече декораторов

Современная альтернатива: декораторы TC39 Stage 3 (TypeScript 5.0+)

Начиная с TypeScript 5.0, появилась поддержка стандартных декораторов (proposal TC39 Stage 3). Они не требуют experimentalDecorators, но имеют другой синтаксис. Вот как переписать ваш пример:

// Стандартный декоратор (без experimentalDecorators)
function log(target: any, context: ClassMethodDecoratorContext) {
  const methodName = String(context.name);
  return function(this: any, ...args: any[]) {
    console.log(`Вызов ${methodName} с аргументами:`, args);
    return target.call(this, ...args);
  };
}

class Calculator {
  @log
  add(a: number, b: number): number {
    return a + b;
  }
}

Обратите внимание: в стандартных декораторах:

  • Второй параметр — context (объект с информацией о декорируемом элементе)
  • Возвращаемое значение — функция-замена (а не PropertyDescriptor)
  • Не нужен experimentalDecorators: true в tsconfig

Что выбрать?

  • Если проект уже использует экспериментальные декораторы (Angular, NestJS, TypeORM) — просто включите experimentalDecorators: true
  • Если пишете новый проект — используйте стандартные декораторы TypeScript 5.0+, они более перспективны
  • Если вы новичок — начните с experimentalDecorators: true, это проще и понятнее

Ваш код не упадёт в production, но следите за обновлениями TypeScript — в будущем экспериментальные декораторы могут быть удалены.

<<>>

Альтернативный подход: отключение предупреждения через комментарий

Если вы не хотите менять глобальные настройки проекта, можно подавить предупреждение для конкретного файла с помощью комментария // @ts-nocheck или // @ts-ignore. Но это плохая практика — лучше настроить tsconfig правильно.

Использование Babel вместо TypeScript для декораторов

Если вы работаете с React или другим фронтенд-стеком, можно настроить Babel для транспиляции декораторов. Пример конфигурации .babelrc:

{
  "plugins": [
    ["@babel/plugin-proposal-decorators", { "legacy": true }]
  ]
}

В этом случае TypeScript будет только проверять типы, а Babel — компилировать код. Это разделяет ответственность и убирает предупреждение TypeScript.

Простое игнорирование (не рекомендуется)

Вы можете добавить в tsconfig опцию "suppressImplicitAnyIndexErrors": true или "noImplicitAny": false, но это не решит проблему с декораторами. Лучше явно включить experimentalDecorators.

Помните: предупреждение — это не ошибка, а уведомление. Но если вы хотите чистый вывод компиляции, настройте tsconfig или перейдите на стандартные декораторы TypeScript 5.0+.