对于打字稿,当前未启用“decorators-legacy”的错误,事件我设置了experimentalDecorators和emitDecoratorMetadata为真

Posted

技术标签:

【中文标题】对于打字稿,当前未启用“decorators-legacy”的错误,事件我设置了experimentalDecorators和emitDecoratorMetadata为真【英文标题】:for typescript the error for 'decorators-legacy' isn't currently enabled, event I set experimentalDecorators and emitDecoratorMetadata is true 【发布时间】:2020-11-30 19:43:47 【问题描述】:

我将 typeorm 与 next.js 和 typescript 一起使用,我的 tsconfig.json 是:


  "compilerOptions": 
    "target": "es5",
    "lib": [
      "dom",
      "dom.iterable",
      "esnext",
      "es5",
      "es6"
    ],
    "allowJs": true,
    "skipLibCheck": true,
    "strict": false,
    "forceConsistentCasingInFileNames": true,
    "noEmit": true,
    "esModuleInterop": true,
    "module": "esnext",
    "moduleResolution": "node",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "jsx": "preserve"
  ,
   include: ...


我设置experimentalDecorator 为true。我的打字稿是 3.9.7,我的 typeorm 是 0.2.25。 编译错误是:

error - ./db/entity/User.ts:7:1
Syntax error: Support for the experimental syntax 'decorators-legacy' isn't currently enabled:

   5 |
   6 |
>  7 | @Entity()
     | ^
   8 | export class User 
   9 |
  10 |     @PrimaryGeneratedColumn()

我已经启用了 emitDecoratorMetadata, Hoe 来为 tsconfig.json 启用 decorators-legacy

【问题讨论】:

【参考方案1】:

如果您只想导入 User 类型,并使用 TypeScript >= 3.8,您可以使用 type-only imports 来执行此操作。只需在import-关键字后添加type。这确保了只导入类的类型,从而避免了整个装饰器问题,因为类型被 babel 忽略/删除。

import type  User  from "path/to/db/entity/User";

【讨论】:

【参考方案2】:

我的一个同事刚刚遇到了同样的问题:这是 Babel 抛出的一个错误,它无法处理类装饰器。 事实上,即使你在代码中不使用 Babel,Next.JS 也会在前端使用。

确保不要在前端代码中导入 ./db/entity/User.ts 或任何其他 TypeORM 类。

【讨论】:

在一个后端应用程序中出现同样的问题。该应用程序具有间接 babel 依赖项。当我创建 .babelrc 时,又出现了另一个错误。不创建 .babelrc 可以解决吗?

以上是关于对于打字稿,当前未启用“decorators-legacy”的错误,事件我设置了experimentalDecorators和emitDecoratorMetadata为真的主要内容,如果未能解决你的问题,请参考以下文章

在打字稿文件上启用 Eslint

打字稿方法返回未定义的方法装饰器

打字稿 - 未捕获的 ReferenceError:未定义导出

未调用打字稿方法

使用打字稿时出现“未捕获的 ReferenceError:未定义角度”

打字稿方法返回未定义?