如何在TypeScript中以嵌套方式导出多个接口?

Gol*_*den 5 javascript npm typescript es6-modules

我有一个用TypeScript编写的相当大的npm模块,它公开了许多类型,包括多个接口。现在,这些接口在根级别上都不都是有意义的,这就是为什么我想以一种可以嵌套的方式导入它们的方式来公开它们。

基本上,我正在寻找一种公开接口的方法,以便该模块的用户可以执行以下操作:

import { Foo } from 'my-module';
import { Bar } from 'my-module/sub-part';
Run Code Online (Sandbox Code Playgroud)

这可以在TypeScript中使用吗?如果可以,怎么办?什么工作是这个代码在根index.ts文件:

export {
  Foo,
  { Bar }
};
Run Code Online (Sandbox Code Playgroud)

请注意,这些.ts文件不在模块的根目录中,因此.js.d.ts文件也不是。

我该如何解决?

PS:这与默认导出和命名导出无关,因为我想为导出多个嵌套级别的接口提供解决方案。

for*_*d04 1

在最简单的情况下,您只需在已发布的 npm 包的和文件夹index.d.ts内有单独的文件,这样我们就可以导入和my-modulemy-module/sub-partmy-modulemy-module/sub-part。示例项目目录:

\n\n
my-module\n|   dist\n\xe2\x94\x82   index.ts\n\xe2\x94\x82   package.json // types prop e.g. could point to dist/index.d.ts\n\xe2\x94\x82\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80sub-part\n        index.ts // compiled to dist/sub-part/index.d.ts\n
Run Code Online (Sandbox Code Playgroud)\n\n

TS 利用其模块解析过程来解析my-modulemy-module/sub-part导入(假设不@types存在类似的全局类型声明)。例如,my-moduleinimport { Foo } from \'my-module\'这样解析的

\n\n
// first, try to find file directly\nnode_modules/my-module.ts\nnode_modules/my-module.tsx\nnode_modules/my-module.d.ts\n\n// look in package.json for types property pointing to a file\nnode_modules/my-module/package.json // <-- lands here, if "types" prop exists\n\n// look in @types\nnode_modules/@types/my-module.d.ts\n\n// treat my-module as folder and look for an index file\nnode_modules/my-module/index.ts\nnode_modules/my-module/index.tsx\nnode_modules/my-module/index.d.ts // <-- lands here otherwise\n
Run Code Online (Sandbox Code Playgroud)\n\n

为了此处的完整性,my-modulemy-module/sub-part可以将 和 定义为一个包含文件中的单独的全局模块声明,例如:

\n\n
declare module "my-module" {\n  const Foo: string\n}\n\ndeclare module "my-module/sub-part" {\n  const Bar: number\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

最后,客户端代码如下所示:

\n\n
import { Foo } from "my-module";\nimport { Bar } from "my-module/sub-part";\n\nconsole.log(Foo)\n
Run Code Online (Sandbox Code Playgroud)\n\n

希望能帮助到你。

\n