vercel / next.js

The React Framework
https://nextjs.org
MIT License
123.2k stars 26.31k forks source link

Typescript 5 decorators do not build #48360

Open austinlogo opened 1 year ago

austinlogo commented 1 year ago

Verify canary release

Provide environment information

Operating System:
      Platform: darwin
      Arch: arm64
      Version: Darwin Kernel Version 22.3.0: Mon Jan 30 20:39:46 PST 2023; root:xnu-8792.81.3~2/RELEASE_ARM64_T6020
    Binaries:
      Node: 19.7.0
      npm: 9.5.0
      Yarn: 1.22.19
      pnpm: N/A
    Relevant packages:
      next: 13.3.1-canary.6
      eslint-config-next: N/A
      react: 18.2.0
      react-dom: 18.2.0

Which area(s) of Next.js are affected? (leave empty if unsure)

SWC transpilation

Link to the code that reproduces this issue

https://github.com/austinlogo/nextjs-typescript-5

To Reproduce

Install and build as normal you should see an error in building types.

When you use the experimental flags in the tsconfig.json

Describe the Bug

This build Error

./src/pages/api/hello.ts
Error:
  × Unexpected token `@`. Expected identifier, string literal, numeric literal or [ for the computed key
    ╭─[/Users/logo/workspaces/scratch/ts5/test-types/src/pages/api/hello.ts:23:1]
 23 │ }
 24 │
 25 │ class Test {
 26 │   @loggedMethod
    ·   ─
 27 │   myMethod() {
 28 │     return "hello";
 29 │   }
    ╰────

Expected Behavior

I would expect it to build.

Which browser are you using? (if relevant)

No response

How are you deploying your application? (if relevant)

No response

NEXT-1559

nandorojo commented 1 year ago

Same with function f<const T>() {} generics not working.

Frikki commented 1 year ago

@nandorojo Please open a different issue after verifying that nobody hasn’t already reported the issue.

nandorojo commented 1 year ago

Fair suggestion, however, I think it’s under the same umbrella issue: TS 5 features not being supported. My guess is all syntax gets supported together by upgrading the TS version Next (or SWC) uses.

pokatomnik commented 1 year ago

This is SWC-only issue. Fortunately, NextJS allows to switch back to the original TSC instead of SWC. I tried It, and It IS working right now. My advice: use TSC. This is the only fully-functional TS compiler right now.

nandorojo commented 1 year ago

Oh, good to know. What did you do exactly?

pokatomnik commented 1 year ago

Oh, good to know. What did you do exactly?

  1. Install ts-loader
  2. Configure your next.config.js like this:

    module.exports = {
    webpack: (config) => {
    config.module.rules.push({
      test: /\.tsx?$/,
      use: [
        {
          loader: "ts-loader",
          options: { transpileOnly: true },
        },
      ],
    });
    
    return config;
    },
    };
  3. try to run npm start dev

You may notice there will be some errors in the console (ts-loader cannot handle some imports located in the newly created app). Remove them or try to solve those errors by yourself.

runjuu commented 10 months ago

Another way to quickly fix this issue, without waiting for NextJS to update, is to use patch-package or pnpm patch to directly enable SWC's stage 3 decorator support.

An example of how to use pnpm patch to enable this can be found at https://github.com/orch-js/orch-js/commit/47b28ee29fad3ebf688fd56cfe5c96aaac3e1c28. Just simply mark decorators as true and specify the decoratorVersion to 2022-03.

yanickrochon commented 9 months ago

I have a library using TypeScript 5, nothing special with the tsconfig.json. This library is built, imported in the Next application, and it fails.

If the above solution works, it should be added to Next's configuration; opt-in to enable TS decorators.

Traveller23 commented 4 months ago

Next.js is now at version 14.1.0, and this issue has not yet been officially resolved (though thanks to @runjuu for the solution).

qd-qd commented 2 months ago

Next.js is now at version 14.2.3, and this issue has not yet been officially resolved. Give us the ability to use decorators.

dartess commented 2 months ago

Hello @kdy1, I see you self-assigned this almost half a year ago. Please share, is there any news or ETA?

sawich commented 3 weeks ago

Status? 👀

kdy1 commented 3 weeks ago

https://github.com/vercel/next.js/pull/65963