Как экспортировать несколько интерфейсов вложенным способом в TypeScript? - PullRequest
5 голосов
/ 28 октября 2019

У меня довольно большой модуль npm, написанный на TypeScript, который предоставляет несколько типов, включая несколько интерфейсов. Теперь не все эти интерфейсы имеют смысл на корневом уровне, поэтому я хотел бы представить их таким образом, чтобы их можно было импортировать несколько вложенным способом.

По сути, я ищуспособ предоставления интерфейса, чтобы пользователь модуля мог сделать:

import { Foo } from 'my-module';
import { Bar } from 'my-module/sub-part';

Возможно ли это в TypeScript, и если да, то как? Что не работает, так это код в корневом файле index.ts:

export {
  Foo,
  { Bar }
};

Обратите внимание, что файлы .ts не находятся в корневом каталоге модуля, ипоэтому файлы .js и .d.ts тоже не являются.

Как я могу решить эту проблему?

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

1 Ответ

1 голос
/ 28 октября 2019

В простейшем случае у вас просто есть отдельные файлы index.d.ts внутри папки my-module и my-module/sub-part опубликованного пакета npm, поэтому мы можем импортировать my-module и my-module/sub-part отдельно. Пример каталога проекта:

my-module
|   dist
│   index.ts
│   package.json // types prop e.g. could point to dist/index.d.ts
│
└───sub-part
        index.ts // compiled to dist/sub-part/index.d.ts

TS использует процесс разрешения модуля для разрешения импорта my-module или my-module/sub-part (если не существует глобального объявления типа, такого как @types). Например, my-module в import { Foo } from 'my-module' разрешается следующим образом: this :

// first, try to find file directly
node_modules/my-module.ts
node_modules/my-module.tsx
node_modules/my-module.d.ts

// look in package.json for types property pointing to a file
node_modules/my-module/package.json // <-- lands here, if "types" prop exists

// look in @types
node_modules/@types/my-module.d.ts

// treat my-module as folder and look for an index file
node_modules/my-module/index.ts
node_modules/my-module/index.tsx
node_modules/my-module/index.d.ts // <-- lands here otherwise

Для полноты здесь my-module и my-module/sub-part также могут быть определены как отдельные глобальные объявления модуля в одном файле, например:

declare module "my-module" {
  const Foo: string
}

declare module "my-module/sub-part" {
  const Bar: number
}

Наконец, код клиента выглядит так, как вы уже изобразили:

import { Foo } from "my-module";
import { Bar } from "my-module/sub-part";

console.log(Foo)

Надеюсь, это поможет.

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