Vyhledávání na webu

typescript - V modulech s rozšířeními nejsou povoleny exporty a přiřazení exportu


import { Request as ExpressRequest, Response as ExpressResponse } from 'express';
declare module 'kvl' {
    export = kvl;
}
declare const kvl: {
    ValidationDone:(param:(error: any, response: ExpressResponse) => void) => void;
}

V modulových rozšířeních nejsou povoleny exporty ani exportní přiřazení.

Byl jsem deklarován v .d.ts, nemůžu to takhle použít?

Odpověď č. 1

Rozšíření modulu:

TypeScript tomu říká rozšíření modulu: Používáte existující modul a přidáváte do něj nové definice. Rozšíření modulu mají vlastní syntaxi:

  • modul, který deklarujete, musí mít stejné jméno jako rozšířený modul
  • uvnitř modulu nemůžete nic exportovat

To je popsáno zde: https://github.com/Microsoft/TypeScript-Handbook/blob/fa9e2be1024014fe923d44b1b69d315e8347e444/pages/Declaration%20Merging.md#module-augmentation

Podle dokumentace se váš kód stane takto:

// file1.ts
import { Request as ExpressRequest, Response as ExpressResponse } from 'express';

// module name must be "express"
declare module 'express' {

    // this can't be an export
    const kvl : {
        ValidationDone:(param:(error: any, response: ExpressResponse) => void) => void;
      }
}

Teď jste rozšířili modul express a můžete ho používat takto:

// file2.ts
import {kvl} from "express";

// ...

Modulární deklaranční soubor:

Pokud nechcete vkládat své nové typy do modulu express, můžete použít deklaracní soubor pro svůj nový modul. Existuje různé typy, dobrý přehled lze najít zde: https://www.typescriptlang.org/docs/handbook/declaration-files/library-structures.html

V podstatě musíte zkontrolovat, jak je kód používán, a pak přizpůsobit své deklarace tomu. Ve vašem případě to vypadá, že chcete importovat kvl jako modul. Takže se můžete orientovat podle tohoto ukázkového souboru: https://www.typescriptlang.org/docs/handbook/declaration-files/templates/module-d-ts.html

Změnil jsem váš kód na odpovídající syntaxi. Mimochodem, toto je správné pouze v souboru .d.ts:

//kvl.d.ts
import { Request as ExpressRequest, Response as ExpressResponse } from 'express';

export as namespace kvl;

export const kvl : {
    ValidationDone:(param:(error: any, response: ExpressResponse) => void) => void;
    };

Implementace modulu:

Pokud je kvl váš vlastní kód, nemusíte pracovat se soubory deklarací. Typescript může analyzovat vaše moduly. Definice modulu, která by vytvořila konstantu kvl s správným typem, by mohla vypadat takto:

// kvl.ts
import { Request as ExpressRequest, Response as ExpressResponse } from 'express';
export const kvl : {
    ValidationDone:(param:(error: any, response: ExpressResponse) => void) => void;
    } = {ValidationDone: function(param){}};

Vezměte prosím na vědomí, že moduly automaticky mají jako název souboru název modulu. Proto by kód výše měl být v souboru s názvem kvl.ts.

Související články