Экспорт и назначения экспорта не разрешены в расширениях модуля - PullRequest
0 голосов
/ 07 ноября 2018
`
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;
}
`

Экспорт и назначения экспорта не допускаются в расширениях модуля.

Я был объявлен в .d.ts , Разве я не могу использовать это так?

1 Ответ

0 голосов
/ 07 ноября 2018

Увеличение модуля:

Typescript называет это расширением модуля: вы используете существующий модуль и добавляете в него новые определения. Модификации модуля имеют собственный синтаксис:

  • модуль, который вы объявляете, должен иметь то же имя, что и расширенный модуль
  • внутри модуля вы ничего не можете экспортировать

Это описано здесь: https://github.com/Microsoft/TypeScript-Handbook/blob/fa9e2be1024014fe923d44b1b69d315e8347e444/pages/Declaration%20Merging.md#module-augmentation

Следуя документам, ваш код становится таким:

// 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;
      }
}

Теперь вы дополнили модуль express и можете использовать его следующим образом:

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

// ...

Файл модульной декларации:

Если вы не хотите вставлять новые типы в экспресс-модуль, вы можете использовать файл декларации для вашего нового модуля. Существуют различные типы, хороший обзор можно найти здесь: https://www.typescriptlang.org/docs/handbook/declaration-files/library-structures.html

По сути, вы должны проверить, как используется код, а затем адаптировать ваши декларации к этому. В вашем случае похоже, что вы хотите импортировать kvl как модуль. Таким образом, вы можете сориентироваться на этом примере файла: https://www.typescriptlang.org/docs/handbook/declaration-files/templates/module-d-ts.html

Я изменил ваш код на соответствующий синтаксис. Кстати, это правильно только в файле .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;
    };

Реализация модуля:

Если kvl - ваш собственный код, вам не нужно работать с файлами объявлений. Typescript может анализировать ваши модули. Определение модуля, которое будет производить константу kvl с правильным типом, могло бы выглядеть так:

// 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){}};

Обратите внимание, что имена модулей автоматически называются по модулю. Поэтому приведенный выше код должен находиться в файле с именем kvl.ts.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...