【问题标题】:How can I hide 'private' methods with JSDoc Typescript Declarations?如何使用 JSDoc Typescript 声明隐藏“私有”方法?
【发布时间】:2020-05-12 12:37:34
【问题描述】:

假设我有一个 JavaScript 类

/**
 * @element my-element
 */
export class MyElement extends HTMLElement {
  publicMethod() {}
  /** @private */
  privateMethod() {}
}

customElements.define('my-element', MyElement);

以及使用declarationallowJs 生成的声明文件:

export class MyElement extends HTMLElement {
  publicMethod(): void;
  /** @private */
  privateMethod(): void
}

我还在构建后脚本中将其连接到声明文件:

declare global { interface HTMLElementTagNameMap { 'my-element': MyElement; } }

在打字稿文件中使用此元素时,我可以在自动完成中访问privateMethod

import 'my-element'
const me = document.createElement("my-element")
me.// autocompletes `privateMethod`

如何指示tsc 将使用@private JSDoc 标记注释的任何方法、字段或属性标记为私有?

【问题讨论】:

    标签: javascript typescript private jsdoc .d.ts


    【解决方案1】:

    根据 JSDoc 文档,使用 /** @private */ 是正确的语法,但这不是 TypeScript 处理它的方式。您需要利用 TypeScripts 语法来处理这个问题,它不能单独与 JSDoc 一起使用。

    TypeScript 3.8 and up supports ES6 style private fields。您可以在方法的开头使用 # 符号来表示私有字段,如下所示:

    class Animal {
      #name: string;
      constructor(theName: string) {
        this.#name = theName;
      }
    }
    
    // example
    
    new Animal("Cat").#name;
    Property '#name' is not accessible outside class 'Animal' because it has a private identifier.
    

    或者,TypeScript also allows you to declare a field as private 使用private 标记,将提供所需的结果。这样做不会在自动完成期间显示privateMethod(至少对我来说不会)。

    /**
     * @element my-element
     */
    class MyElement extends HTMLElement {
      publicMethod() {}
      /** @private */
      private privateMethod() {}
    }
    
    let element = new MyElement()
    
    element.privateMethod()
    // Error: Property 'privateMethod' is private and only accessible within class 'MyElement'.
    

    这是一个使用 VS Code 智能感知的示例。

    【讨论】:

    • 如果你使用['privateMethod'] 语法,VS Code 会自动完成私有方法
    【解决方案2】:

    确保您使用的是正确版本的打字稿。 Typescript 3.8 添加了support for this,使用Typescript 3.8 或heigher 应该支持@private jsdoc 修饰符。

    您可以使用tsc -h 获取有关已安装的打字稿编译器版本的信息。

    【讨论】:

    • 我刚刚尝试使用 TypeScript 4.0.3:在函数参数上执行 @private 不会将其隐藏在 IntelliSense 中。
    • @brillout 我不确定,我用4.03 检查了我的工作区,它似乎工作正常。我已经添加了这个 stackblitz,如果你可以看看:stackblitz.com/edit/typescript-gygcmw。我有 my-element.js 与您的声明相同,test.ts 我正在尝试使用 MyElement 并且 vscode 没有在那里公开私有变量和方法。
    • 您的示例显示了一个私有类方法 - 我想要做的是从 IntelliSense 隐藏一个函数参数。 (OP询问了私有类方法,因此我会奖励你赏金。)具体来说:我试图向用户隐藏__INTERNAL_universalAdaptergithub.com/reframejs/wildcard-api/blob/…
    • 啊,我明白了,对不起,我没有意识到这一点。您是否想在 github 上向 typescript repo 添加功能请求?
    【解决方案3】:

    您需要为那些希望从文档中排除的方法和类使用 @ignore 注释。

    @ignore 标记表示代码中的符号永远不应出现在文档中。

    /**
     * @class
     * @ignore
     */
    function Jacket() {
        /** The jacket's color. */
        this.color = null;
    }
    
    /**
     * @namespace
     * @ignore
     */
    var Clothes = {
        /**
         * @class
         * @ignore
         */
        Jacket: function() {
            /** The jacket's color. */
            this.color = null;
        }
    };
    

    更多信息在这里:https://jsdoc.app/tags-ignore.html

    【讨论】:

    猜你喜欢
    • 2017-04-17
    • 2016-07-27
    • 2020-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    相关资源
    最近更新 更多