typescript - ΣΦΑΛΜΑ: Ο κατασκευαστής της κλάσης t δεν μπορεί να κληθεί χωρίς 'new' στο NestJS με Prisma


Προσπαθώντας να δημιουργήσω τον Prisma client σε εφαρμογή NestJS. Συνεχώς λαμβάνω σφάλμα:

[Nest] 14352  - 12.05.2023, 23:21:13   ERROR [ExceptionHandler] Class constructor t cannot be invoked without 'new'

TypeError: Class constructor t cannot be invoked without 'new'                                                     
    at new PrismaService (C:\work\js\cyno-desu\dist\prisma\prisma.service.js:66:42)                                
    at Injector.instantiateClass (C:\work\js\cyno-desu\node_modules\@nestjs\core\injector\injector.js:351:19)
    at callback (C:\work\js\cyno-desu\node_modules\@nestjs\core\injector\injector.js:56:45)
    at Injector.resolveConstructorParams (C:\work\js\cyno-desu\node_modules\@nestjs\core\injector\injector.js:136:24)
    at Injector.loadInstance (C:\work\js\cyno-desu\node_modules\@nestjs\core\injector\injector.js:61:13)
    at Injector.loadProvider (C:\work\js\cyno-desu\node_modules\@nestjs\core\injector\injector.js:88:9)
    at Injector.lookupComponentInImports (C:\work\js\cyno-desu\node_modules\@nestjs\core\injector\injector.js:281:17)
    at Injector.lookupComponentInParentModules (C:\work\js\cyno-desu\node_modules\@nestjs\core\injector\injector.js:245:33)
    at Injector.resolveComponentInstance (C:\work\js\cyno-desu\node_modules\@nestjs\core\injector\injector.js:200:33)
    at resolveParam (C:\work\js\cyno-desu\node_modules\@nestjs\core\injector\injector.js:120:38)

Ο κώδικας προκαλεί σφάλμα:

    import { Injectable, OnModuleInit, INestApplication } from '@nestjs/common';
    import { PrismaClient } from '@prisma/client';
    
    @Injectable()
    export class PrismaService extends PrismaClient implements OnModuleInit {
      async onModuleInit() {
        await this.$connect();
      }
    
      async enableShutdownHooks(app: INestApplication) {
        this.$on('beforeExit', async () => {
          await app.close();
        });
      }
    }

Εξαρτήσεις :

  "devDependencies": {
    "@nestjs/cli": "^9.0.0",
    "@nestjs/schematics": "^9.0.0",
    "@nestjs/testing": "^9.0.0",
    "@types/express": "^4.17.13",
    "@types/jest": "29.5.0",
    "@types/node": "18.15.11",
    "@types/supertest": "^2.0.11",
    "@typescript-eslint/eslint-plugin": "^5.0.0",
    "@typescript-eslint/parser": "^5.0.0",
    "eslint": "^8.0.1",
    "eslint-config-prettier": "^8.3.0",
    "eslint-plugin-prettier": "^4.0.0",
    "jest": "29.5.0",
    "prettier": "^2.3.2",
    "prisma": "^4.13.0",
    "source-map-support": "^0.5.20",
    "supertest": "^6.1.3",
    "ts-jest": "29.0.5",
    "ts-loader": "^9.2.3",
    "ts-node": "^10.0.0",
    "tsconfig-paths": "4.2.0",
    "typescript": "^4.7.4"
  },

Έχω προσπαθήσει να εισάγω μια νέα λέξη-κλειδί σε διάφορα μέρη αλλά νιώθω ότι είναι θέμα με το dependency injection στην πλευρά του NestJS. Είναι τόσο απλό παράδειγμα που είμαι σαστισμένος που κανένας δεν έχει εντοπίσει ακόμα το σφάλμα. Συνήθιζα να γράφω κάποιο κώδικα σε Java, οπότε είμαι αρκετά συνηθισμένος στην αντικειμενικότητα αλλά εδώ δεν έχω ιδέα ποιο είναι το πρόβλημα.

Απάντηση #1

https://bobbyhadz.com/blog/typescript-class-constructor-cannot-be-invoked-without-new

Ο κατασκευαστής της κλάσης δεν μπορεί να κληθεί χωρίς 'new' στο TypeScript

Το σφάλμα «Ο κατασκευαστής της κλάσης δεν μπορεί να κληθεί χωρίς το new» εμφανίζεται όταν η ιδιότητα target στο tsconfig.json είναι ρυθμισμένη σε χαμηλότερο επίπεδο από το es6 ή όταν δημιουργείτε μια κλάση χωρίς τον τελεστή new.

Για να λύσετε το σφάλμα, ορίστε τον στόχο σε es6 και χρησιμοποιήστε τον τελεστή new κατά τη δημιουργία αντικειμένων κλάσεων.

Το πρώτο πράγμα που πρέπει να κάνετε είναι να ανοίξετε το αρχείο tsconfig.json σας και να βεβαιωθείτε ότι η επιλογή target είναι ορισμένη σε es6 ή νεότερη έκδοση.

tsconfig.json

{
  "compilerOptions": {
    "target": "es6",
    // ... your other options
  }
}

Η επιλογή target καθορίζει την έκδοση γλώσσας για τα εκδιδόμενα αρχεία JavaScript.

Όλοι οι σύγχρονοι περιηγητές (και το Node.js) υποστηρίζουν όλες τις δυνατότητες του ES6. Όταν η επιλογή στόχου σας οριστεί σε κάτι παλαιότερο από το es6 (π.χ. es5), το TypeScript πρέπει να μεταγλωττίσει τις κλάσεις σας σε συναρτήσεις, κάτι που θα μπορούσε να είναι προβληματικό σε ορισμένες περιπτώσεις. Αν αυτό είναι η αιτία του σφάλματος, η ρύθμιση του στόχου σε es6 θα πρέπει να το επιλύσει.

Βεβαιωθείτε ότι έχετε επανεκκινήσει τον επεξεργαστή κώδικα και τον διακομιστή ανάπτυξης αν το σφάλμα συνεχίζεται.

Το tsconfig.build.json μου

{
  "extends": "./tsconfig.json",
  "exclude": ["node_modules", "test", "dist", "**/*spec.ts"],
  "compilerOptions": {
   
    //THIS!@
    "target": "es5",
    "module": "commonjs",
    "strict": true,
    "esModuleInterop": true,
    "forceConsistentCasingInFileNames": true,
    "baseUrl": "./",
    "paths": {
      "*": ["src/*"]
    },
    "endOfLine": "crlf" // set endOfLine to "crlf" for Windows CRLF
  }
}