Website-Suche

Visual Studio Code - TypeScript: wie man Definitionen in separate Dateien aufteilt


Ich verwende eine einzelne Definitionsdatei für ein ganzes TS-Projekt, und es funktioniert einwandfrei.

Ich würde gerne wissen, ob es möglich ist, die TS-Definitionen nach Funktion/Komponente in separate Dateien zu unterteilen. Auf diese Weise hätte jede Komponente ihre eigenen Definitionen, die den Hauptdefinitionsbereich erweitern, genau wie es @types in Bezug auf Angular und seine Plugins (animate, ui.router und so weiter) tut. Aber ich bin mir nicht sicher, wie man das macht.

Meine Ordnerstruktur:

index.ts
index.d.ts
app
    shared
        shared.ts
        shared.d.ts
        user.ts
        config.ts
    login
        login.ts
        login.d.ts
        login.component.ts
        login.component.html

Meine Definitionsdateien:

// shared.d.ts
export namespace shared {
    interface IConfig {
        url: string;
    }
}

// login.d.ts
export namespace login {
    interface ILogin {
        logIn(): Promise<any>;
        logOut(): Promise<any>;
    }
}

// index.d.ts
import * as sharedModule from './app/shared/shared';
import * as loginModule from './app/login/login';

declare module App {
    // extend the App module with the imported definitions. How?   
}

Meine tsconfig.json

{
  "compilerOptions": {
    "sourceMap": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "removeComments": false,
    "noImplicitAny": false,
    "typeRoots": ["node_modules/@types/", "src/"]
  },
  "compileOnSave": false,
  "filesGlob": [
    "src/**/*.ts",
    "src/**/*.tsx",
    "!node_modules/**"
  ]
}

Ist es möglich? Wie kann ich das tun?

Antwort #1

Eine Möglichkeit ist, reference path zu verwenden und Namespaces zu deklarieren, anstatt sie zu exportieren.

geteilt.d.ts

declare namespace shared {
    interface IConfig {
        url: string;
    }
}

login.d.ts

declare namespace login {
    interface ILogin {
        logIn(): Promise<any>;
        logOut(): Promise<any>;
    }
}

index.d.ts

/// <reference path="shared.d.ts" />
/// <reference path="login.d.ts" />

declare module "App" {
    // we now have access to the `shared` namespace.
    const config: shared.IConfig;
}

Hier ist ein Screenshot des oben in VSCode funktionierenden.