modul - Typescript tilpasset typedefinisjon bryter ved import av klasse


Jeg har en egendefinert typedefinisjon for å utvide et eksisterende grensesnitt (Express Request som vist her). Innholdet i express.d.ts:

declare namespace Express {
  export interface Request {
    name: string
  }
}

Fungerer fint. Men i stedet for at name er en streng, trenger jeg nå at det er en egendefinert klasse MyClass. Klasse definisjonen ser slik ut:

export class MyClass {
  first: string;
  last: string;
}

Jeg endrer grensesnittforsterkningen til:

import { MyClass } from "../routes/myClass";
declare namespace Express {
  export interface Request {
    name: MyClass
  }
}

Nå får jeg følgende feil når jeg prøver å få tilgang til req.name:

error TS2339: Property 'name' does not exist on type 'Request'.

Jeg har funnet ut at min express.d.ts effektivt blir et «modul» på grunn av den tilleggte import-setningen. Likevel er det ikke klart for meg hvordan jeg kan overvinne problemet mitt.

Svar #1

Som @unional nevnte i kommentaren, når du har toppnivå-import eller -eksport i en fil, blir toppnivå-omfanget i filen et modulomfang, atskilt fra globalt omfang.

For å endre global deklarasjon i en modul, må du bruke declare global for å referere til Express i det globale navnerommet:

import { MyClass } from "../routes/myClass";
declare global {
  namespace Express {
    export interface Request {
      name: MyClass
    }
  }
}

Relaterte artikler