我正在用正通过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
,因为我正在整个库中导入和使用它,但是我不想公开地公开它。我尝试使用名称空间,但无法真正使它正常工作。
答案 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;
这样,我构造了两个概念(ActionType
和Action<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,但是这样做没有多大意义。如果您发布开源代码,则不会阻止任何人提取代码的任何部分。