在TS中构建一个由TS和JS代码调用的库,并想知道人们如何隐藏内部方法和字段。 Java具有处理此功能的包可见性。在TS中缺乏这一点,我看到两个选择:
将接口定义为仅公开某些成员。但这涉及复制定义和额外代码以将参数从接口转换为实现类型。
在内部成员上添加@private doc评论。可能会将其从生成的文档中排除。
注意:私有限定符不是解决方案,因为它只允许来自同一类访问的代码。我在谈论需要从同一个库中的其他类访问字段,但阻止从库的客户端访问。这就是Java的包访问所做的事情。
答案 0 :(得分:4)
从TypeScript 3.1开始,您可以使用stripInternal
编译器选项。生成声明文件时,这会停止为带有@internal
JSDoc批注的代码生成声明。
可以在tsconfig.json
文件中启用此编译器选项:
{
"compilerOptions" : {
...
"stripInternal": true
}
}
例如,将取消显示以下声明:
//Class will not be visible
/** @internal */
export class MyHelperClass {
}
export class MyPublicClass {
//Method will not be visible
/** @internal */
helperMethod() {}
}
// Binding will not be visible
/** @internal */
export const MyValue = 5;
但是,这不会影响查看*.ts
源文件的代码,例如您自己的代码。
如果像大多数NPM软件包一样以*.js
和*.d.ts
文件的形式分发软件包,这将有效地将成员隐藏在软件包外部的代码中。但是,如果您将代码以*.ts
文件的形式分发,将无济于事。
答案 1 :(得分:2)
private
修饰符关键字将字段和函数标记为私有。 请注意,由于基于原型的语言,最终JavaScript中的所有内容都非常公开。也没有实际的命名空间。所以也许你不应该太担心。良好的文档总是有帮助的。
作为旁注,知道有很多其他的转换器如TypeScript可能会很有趣。例如,Haxe通过更多面向OOP的语言设计解决了这个问题,因为它可以在访问修饰符之上使用元数据授予和请求访问权限。您可能会发现Java更方便。尽管如此,最终一切都将因JavaScript而公开。
答案 2 :(得分:1)
从1.3开始,protected
可用作访问说明符。这是你的一个问题(也是我的!)。
至于限制其他成员对某些库的可见性,至少在涉及TypeScript编译器的地方,您可以创建不同版本的声明文件。
假设您使用--declaration
开关编译文件,生成.d.ts
该文件如下所示:
class Something {
// ...
public internal_use_only: someType;
// ...
}
要生成限制性更强的声明文件,只需将其复制到另一个文件并删除包含internal_use_only
的行。
如果您希望在编译/测试周期内自动执行此操作,则可以使用 [task runner |项目构建实用程序] 脚本,使用--declaration
开关调用编译器,然后然后文本处理实用程序,如grep
(在Linux或Cygwin中找到,它为Windows提供了一些Un * x命令和shell环境)。仅消除有问题的行的grep命令调用如下所示:
cat something.d.ts | grep -v \\binternal_use_only\\b > moreRestrictiveSomething.d.ts
其他shell也有类似的命令,例如Windows / CMD中的findstr
,它也适用于Regular Expressions。