JSDoc Typescript 检查命名默认参数

Pau*_*ham 4 javascript jsdoc typescript checkjs

鉴于以下

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

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

cwa*_*jit 5

更新正确答案

发现的问题实际上是您的 tsconfig 以及 JavaScript 类型检查如何使用它。导致您的配置和我的配置之间存在差异的选项是strict属性。根据配置文档

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

将这些选项中的每一个添加到 my 中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
}
Run Code Online (Sandbox Code Playgroud)

我拥有的 tsconfig 如下所示:

{
    "compilerOptions": {
        "checkJs": true,
        "allowJs": true,
        "outDir": "node_modules/.tmp/",
        "noImplicitAny": true
    },
    "include": [
        "index.js"
    ]
}
Run Code Online (Sandbox Code Playgroud)

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

测试的 TypeScript 版本是 3.7.2

编辑: 检查方括号与非方括号,看起来无关紧要。无论哪种方式,TSC 都很好。