網站搜尋

reactjs - React Vite Typescript 版本 5 無法使用新的裝飾器


我使用 Vite 創建了新的 React TypeScript 應用程式

我執行了 npm create vite@latest 然後選擇了 typescript-swc

  • package.json 中的 Typescript 版本是 ^5.0.2
  • node_modules/typescript/package.json 中的版本是 5.1.3
  • 我的全球版本是 5.1.3

我不明白為什麼我不能使用新的裝飾器

function loggedMethod(originalMethod: any, context: ClassMethodDecoratorContext) {
  console.log(context)
  const methodName = String(context.name)
  function replacementMethod(this: any, ...args: any[]) {
      console.log(`LOG: Entering method '${methodName}'.`)
      const result = originalMethod.call(this, ...args)
      console.log(`LOG: Exiting method '${methodName}'.`)
      return result
  }
  return replacementMethod
}

class Person {
  name: string

  constructor(name: string) {
      this.name = name
  }

  @loggedMethod
  greet() {
      console.log(`Hello, my name is ${this.name}.`)
  }
}
const p = new Person('Ray')
p.greet()

這是我正在嘗試執行的程式碼

如果不在來自 @vitejs/plugin-react-swc 的 vite 配置插件中設置 tsDecorators: true,我無法執行這個。這是我唯一使用的插件,vite 配置中沒有其他內容。

console.log(context) 會將方法名稱 greet 記錄為字串,就像舊的裝飾器一樣,但它應該是物件。replacementMethod 根本不會被呼叫

我還沒有在 tsconfig.ts 中設置 experimentalDecorators

為什麼裝飾器的運作方式像版本4,而不是版本5?

答案#1

Vite 使用 esbuild,而截至 18.17 版本的 esbuild 尚不支援編譯新的裝飾器格式。它可以讀取並理解這些裝飾器,但尚不知道如何為它們生成代碼。

所以如果你想在 esbuild 中使用裝飾器,你現在必須使用舊版本的裝飾器。(如果你想使用新裝飾器而不必等待 esbuild 升級,你就必須使用 babel 或 Typescript 來編譯你的代碼,而不是使用 esbuild。)