【发布时间】:2015-11-18 06:04:31
【问题描述】:
在 TS 中构建一个库以供 TS 和 JS 代码调用,并想知道人们如何隐藏内部方法和字段。 Java 具有包可见性来处理这个问题。在 TS 中缺少这一点,我看到了两个选项:
定义接口以仅公开某些成员。但这涉及复制定义和额外代码以将参数从接口转换为实现类型。
在内部成员上添加@private doc 评论。可能从生成的文档中排除此类。
注意:私有限定符不是解决方案,因为它只允许来自同一类的代码访问。我说的是需要访问同一个库中其他类的字段,但要阻止库的客户端访问。这就是 Java 的包访问所做的。
【问题讨论】:
-
有一个
private修饰符可以在 ES6/TypeScriptclasses 上使用。在编译时,TypeScript 在尝试访问private成员时会出现错误,但在运行时它们仍然可以访问。 (参见typescriptlang.org/Handbook#classes,尤其是“了解私有”部分) -
私有不是解决方案。我已经修改了问题以解释原因。
-
好的,所以你并不真正想要
private,而是更多的内部/包访问。由于 JavaScript 不是这样设计的,因此您想要做的是需要一些第三方 JavaScript 库来强制在运行时访问成员。 TypeScript 及其任何类型约束在运行时不存在。 -
我通过将 API 的公共部分移动到根模块并将所有内部成员移动到子模块来解决这个问题 - 然后为声明 (
.d.ts) 文件配置单独的构建,其中我只包括根模块。这样,子模块中的任何内容最终都会有效地在内部。 (反之亦然,如果您的子模块是公共的,请将您的内部成员移动到特定的子模块,并将其从您的声明构建中排除。) -
有一个内部修饰符的提议——我希望将来能看到:github.com/microsoft/TypeScript/issues/5228
标签: typescript