Typescript API如何隐藏内部成员?

Jon*_*rds 5 typescript

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

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

  2. 在内部成员上添加一个@private doc注释。可能从生成的文档中排除此类。

注意:专用限定符不是解决方案,因为它仅允许来自同一类的代码访问。我说的是需要访问同一库中其他类的字段,但是要阻止该库的客户端访问。这就是Java的程序包访问功能。

Gre*_*Ros 8

从TypeScript 3.1开始,您可以使用stripInternal编译器选项。生成声明文件时,这将停止为具有@internalJSDoc批注的代码生成声明。

可以在tsconfig.json文件中启用此编译器选项:

{
    "compilerOptions" : {
        ...
        "stripInternal": true
    }
}
Run Code Online (Sandbox Code Playgroud)

例如,以下声明将被取消:

//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;
Run Code Online (Sandbox Code Playgroud)

但是,这不会影响查看*.ts源文件的代码,例如您自己的代码。

如果像大多数NPM软件包一样以包*.js*.d.ts文件的形式分发包,这将有效地将成员隐藏在包外部的代码中。但是,如果您将代码作为*.ts文件分发,将无济于事。

  • `--stripInternal`现在[未公开](https://github.com/Microsoft/TypeScript-Handbook/pull/856) (3认同)
  • @JohnLeidegren 实际上已重新记录。 (2认同)

Mar*_*nol 3

  • 您可以使用修饰符关键字将字段和函数标记为私有private
  • 您可以使用命名约定,例如所有私有变量都以下划线开头。
  • 如果不应该公开类,您还可以使用命名约定(带有“Internal”或其他内容的前缀。您还可以在(类)文档中添加该类不打算在框架之外的任何地方使用。

请注意,由于基于原型的语言,最终 JavaScript 中的所有内容都是相当公开的。也没有实际的名称空间。所以也许你不应该太担心。好的文档总是有帮助的。


顺便说一句,了解还有其他很棒的转译器(例如 TypeScript)可能会很有趣。例如,Haxe 更优雅地解决了这个问题,因为它们更面向 OOP 的语言设计,您可以使用访问修饰符之上的元数据来授予和请求访问权限。您可能会发现使用 Java 更方便。尽管如此,最终一切都会因为 JavaScript 而公开。