node.js - Typescript TS2339 eiendom finnes ikke


Denne er en hodebry for meg. Klarer ikke å finne ut av denne... trenger nok et friskt øye på saken

Jeg har følgende kode

import express from 'express';
import { isFunction } from 'lodash';

export class Server {
  private _server = express();
  private _namespace = '/api/v1';
  public constructor(private _port: number) {}

  public addRoute({ path, handler, method }): this {
    var requestHandler = this._server[String(method).toLowerCase()];
    if (false === isFunction(requestHandler)) throw new Error('Invalid HTTP method');
    requestHandler(path, handler);
    return this;
  }
}

Og jeg får stadig de samme feilene, noe som for meg gir overhodet ingen mening...

TSError: ⨯ Unable to compile TypeScript:
src/server/main.ts:21:14 - error TS2339: Property '_port' does not exist on type 'Server'.

21         this._port = _port;
                ~~~~~
src/server/main.ts:22:14 - error TS2339: Property '_server' does not exist on type 'Server'.

22         this._server = express_1.default();
                ~~~~~~~
src/server/main.ts:23:14 - error TS2339: Property '_namespace' does not exist on type 'Server'.

23         this._namespace = '/api/v1';
                ~~~~~~~~~~
src/server/main.ts:34:35 - error TS2339: Property '_server' does not exist on type 'Server'.

34         var requestHandler = this._server[String(method).toLowerCase()];
                                     ~~~~~~~

Dette er bare helt sprøtt for meg...

Jeg bruker typescript 3.6.3, kjører på node 12.8.1 og bruker ts-node 8.4.1 for å legge til TS-støtte

Jeg har limt inn koden og skrevet hele koden på TS-playground. Gjorde noen endringer for å fjerne importene og udefinerte funksjoner, men generelt ser ikke de ovennevnte feilene ut til å dukke opp, så jeg er litt forvirret... hvis noen kunne være så snill å peke meg i retning av å løse dette problemet, ville det være fantastisk :)

Også, her er min tsconfig.json

{
  "compilerOptions": {
    "noImplicitThis": false,
    "rootDir": "src",
    "typeRoots": ["node_modules/@types", "@types"],
    "lib": ["es6"],
    "strict": true,
    "strictPropertyInitialization": false,
    "strictFunctionTypes": true,
    "esModuleInterop": true,
    "target": "es6",
    "noImplicitAny": false,
    "module": "commonjs",
    "moduleResolution": "node",
    "sourceMap": false,
    "pretty": true,
    "outDir": "build",
    "alwaysStrict": false,
    "noImplicitReturns": true,
    "noStrictGenericChecks": true,
    "noUnusedLocals": true,
    "noUnusedParameters": false,
    "suppressImplicitAnyIndexErrors": true,
    "preserveConstEnums": false,
    "strictNullChecks": true,
    "allowSyntheticDefaultImports": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true
  },
  "include": ["./**/*.ts"],
  "compileOnSave": true,
  "exclude": ["node_modules"]
}

Svar #1

Jeg har endelig forstått hva som har skjedd. En ledetråd var at feilene som ble rapportert har rapportert feil på en allerede transpilet kode. Typescript ble kjørt mot en JS-kode...

Hva problemet var, var at jeg startet serveren ved å bruke nodemon og krevde ts-node på nytt manuelt. Dette var kommandoen jeg hadde brukt

nodemon --ext ts --delay 100ms -r ts-node/register src/app.ts 

Og det var greit (og til og med nødvendig) på mitt forrige prosjekt som brukte nodemon 1.18.9.

Men, når jeg satte opp et nytt prosjekt, oppgraderte jeg automatisk nodemon til versjon 1.19.2, og som man kan se i nodemon v1.19.0 utgivelsesnotater, har TS blitt lagt til standard exec-path. Så, når nodemon finner ut at du kjører TS-filer, vil det endre den endelige node-kommandoen

FRA

node -r ts-node/register src/app.ts

TIL

ts-node -r ts-node/register src/app.ts

Som betyr at Typescript vil kjøres to ganger, og andre gang vil det kjøres mot en allerede ferdig transpiliert kode, også kjent som JS-kode.

Uansett, når jeg har endret oppstarts kommandoen til

nodemon --ext ts --delay 100ms src/app.ts 

alt fungerte som forventet.

Håper dette hjelper noen hvis noen støter på et lignende problem

Svar #2

Jeg hadde også dette problemet og brukte lang tid på å prøve å finne ut hva som var galt. Jeg legger dette her for folk som kan støte på dette i fremtiden. Det viser seg at jeg hadde en ts-node som ble registrert på nytt som en del av koden min for å få en Typescript Worker-tråd til å fungere. Hvis du har dette problemet, sjekk nøye om du bruker ts-node i koden.

const path = require("path");
require("ts-node").register(); // <-- BAD
require(path.resolve(__dirname, "./worker.ts"));

Relaterte artikler