Typescript API如何隐藏内部成员?

时间:2015-08-24 17:57:11

标签: typescript

在TS中构建一个由TS和JS代码调用的库,并想知道人们如何隐藏内部方法和字段。 Java具有处理此功能的包可见性。在TS中缺乏这一点,我看到两个选择:

  1. 将接口定义为仅公开某些成员。但这涉及复制定义和额外代码以将参数从接口转换为实现类型。

  2. 在内部成员上添加@private doc评论。可能会将其从生成的文档中排除。

  3. 注意:私有限定符不是解决方案,因为它只允许来自同一类访问的代码。我在谈论需要从同一个库中的其他类访问字段,但阻止从库的客户端访问。这就是Java的包访问所做的事情。

3 个答案:

答案 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