打字稿库:隐藏内部导出

时间:2019-12-01 04:06:52

标签: javascript typescript module shared-libraries

我正在用正通过npm发布的打字稿建立一个库。

在库的起点index.ts中,所有公共类和枚举都被导出。

import { MyClass } from './internal/my-class'
import { MyEnum } from './internal/my-enum'
export { MyClass, MyEnum }

这很好用,但是我注意到用户也可以通过使用文件的直接路径来导入内部函数/类等。

// in a project that installed my library as an npm dependency
import { InternalClass } from 'my-lib/dist/internal/internal-class'

有办法防止这种情况吗?

我需要“导出” InternalClass,因为我正在整个库中导入和使用它,但是我不想公开地公开它。我尝试使用名称空间,但无法真正使它正常工作。

4 个答案:

答案 0 :(得分:3)

使用microbundle或类似工具捆绑您的包裹。 它应该会生成1个文件,并且您的用户只能从该入口点导入。

答案 1 :(得分:2)

我相信打字稿支持类似于IIFE的模块,这些模块可以让您确定范围

module TestModule {
  enum ActionType { A, B, C }
  type Action<P> = {
    type: ActionType,
    payload: P
  }

  export const actionA = (str: string): Action<string> => ({
    type: ActionType.A,
    payload: str
  });

}

export const actionA = TestModule.actionA;

这样,我构造了两个概念(ActionTypeAction<P>),它们仅在内部可用;其他文件只能导入功能actionA()

如果我正确理解模块,则可以在不同的文件中定义相同的模块,而打字稿将尝试合并它们,这样您就可以访问其他文件(在相同的命名模块中)定义的内容,而不必公开导出它们

我在这里学习过:https://fizzylogic.nl/2016/02/07/typescript-internal-vs-external-modules/

答案 2 :(得分:1)

您应该将stripInternal(或从命令行)中的tsconfig.json标志设置为true,并使用带有@internal标签的tsdoc注释。

// internal/my_file.ts
/** @internal */
export function myInternalFunction() {}

请注意,这会将函数从类型声明中删除,因此它不会在编辑器中自动完成,但是如果您确实需要隐藏内部详细信息,我建议您使用带有Rollup和TypeScript插件的代码

答案 3 :(得分:-2)

我认为你不能。

我想您可以使用TS的模块来编译成JS的IIFE as described by Lucas Morgan here,但是这样做没有多大意义。如果您发布开源代码,则不会阻止任何人提取代码的任何部分。