【问题标题】:JSDoc Typescript Checking of Named Default Params命名默认参数的 JSDoc Typescript 检查
【发布时间】:2019-12-04 07:24:39
【问题描述】:

鉴于以下

/**
 * @param {{bar?: string|null}} [param0]
 */
const foo = ({bar = null} = {}) => bar;

Typescript 3.7.2 报告

var bar: string | null Binding element 'bar' implicitly has an 'any' type.ts(7031)

JavaScript 代码按我希望的方式工作,但我如何编写 jsdoc 提示以便 TypeScript 了解解构后的 bar 变量是 string|null 而不是 any

【问题讨论】:

    标签: javascript typescript jsdoc checkjs


    【解决方案1】:

    更新为正确答案

    发现的问题实际上是您的 tsconfig 以及 JavaScript 类型检查如何使用它。导致您的配置与我的配置不同的选项是 strict 属性。根据config documentation

    启用--strict 启用--noImplicitAny--noImplicitThis--alwaysStrict--strictBindCallApply--strictNullChecks--strictFunctionTypes--strictPropertyInitialization

    将这些选项中的每一个添加到我的tsconfig,我发现禁用其中两个选项将消除报告的错误。这些选项是:

    • --strictNullChecks
    • --strictPropertyInitialization(因为没有--strictNullChecks选项就无法启用)

    当我禁用这两个时,它终于对结果感到满意。

    我将示例复制到 TypeScript 文件中,以查看它是否存在类似问题。 TypeScript 版本没有报告具有相同类型签名的错误,但 JavaScript 版本完全忽略了 JSDoc。但是,查看其余代码,它仍然将bar 变量注册为string|null 类型。

    得出这个结论,这可能是 JavaScript 类型检查中的一个错误,以及它如何与这些选项一起工作,尽管这些选项似乎都与这种情况无关。

    编辑:

    我已经检查过了,似乎在 TypeScript 存储库中已经记录了一个错误:

    https://github.com/microsoft/TypeScript/issues/31372

    以前的解决方案(不起作用)

    您应该能够轻松做到这一点。也许从 jsdoc 注释中的参数名称中删除方括号。这个例子很好用:

    /**
     * @param {{bar?: number|null}} _
     */
    const foo = ({ bar = null } = {}) => {
        // do stuff with bar
    }
    

    我的 tsconfig 如下所示:

    {
        "compilerOptions": {
            "checkJs": true,
            "allowJs": true,
            "outDir": "node_modules/.tmp/",
            "noImplicitAny": true
        },
        "include": [
            "index.js"
        ]
    }
    

    这里是包含此代码的存储库,您也可以使用它来检查: https://github.com/cwadrupldijjit/js-typescript-checking

    测试的 TypeScript 版本是 3.7.2

    编辑: 检查了方括号与非方括号,看起来没关系。无论哪种方式,TSC 都可以。

    【讨论】:

    • 我仍然看到上述警告。打字稿 3.7.2 tsconfig json { "compilerOptions": { "allowJs": true, "checkJs": true, "module": "commonjs", "strict": true, "noEmit": true, "lib": ["es2018"], "target": "es2018" }, "include": [ "./src/**/*" ], "compileOnSave": true }
    • 我意识到它实际上与 TypeScript 的版本无关,但它与配置有关。我将用我在挖掘您的tsconfig 和提供的选项时发现的内容更新答案
    • 感谢您的详尽回答。你是最棒的!
    猜你喜欢
    • 1970-01-01
    • 2021-11-25
    • 2019-12-02
    • 2011-11-16
    • 1970-01-01
    • 2014-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多