【问题标题】:Typescript library: Hide internal exportsTypescript 库:隐藏内部导出
【发布时间】:2020-03-26 02:13:11
【问题描述】:

我正在使用 typescript 构建一个通过 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,因为我正在整个库中导入和使用它,但我不想公开它。我尝试使用命名空间,但无法真正发挥作用。

【问题讨论】:

    标签: javascript typescript module shared-libraries


    【解决方案1】:

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

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

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

    【讨论】:

    • 它不会为图书馆用户自动完成,但它会在我开发图书馆时自动完成,对吗?至于 Rollup,它似乎不支持 d.ts: github.com/rollup/plugins/issues/568。理想情况下,我希望我的用户能够通过自动完成等深入研究源代码的内部结构(以防他们好奇),但我不希望他们能够使用任何内部结构。
    • stripInternal 仅影响发出的类型声明(.d.ts 文件)而不影响发出的代码,您是正确的,只有未标记为 @internal 的代码将为您的用户自动完成。如果你想汇总.d.ts 文件,请使用微软官方维护的@microsoft/api-extractor
    • 这样您就可以将 api 提取器用于.d.ts(它只处理类型声明)和实际代码的汇总。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我不认为你可以。

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

      【讨论】:

      • 当然,但它是为了让用户更清楚地知道应该使用什么和不应该使用什么。这也是关于整理 Intelisense。过去发生在我身上,我错误地使用了内部 API,却不知道我不应该使用它。
      猜你喜欢
      • 2015-11-18
      • 2019-04-24
      • 1970-01-01
      • 1970-01-01
      • 2017-02-02
      • 2021-08-15
      • 2010-12-02
      • 2013-08-10
      • 2021-02-25
      相关资源
      最近更新 更多