Javascript JSDoc类型脚本检查命名的默认参数

Javascript JSDoc类型脚本检查命名的默认参数,javascript,typescript,jsdoc,checkjs,Javascript,Typescript,Jsdoc,Checkjs,鉴于以下情况 /** *@param{{bar?:字符串| null}}[param0] */ 常量foo=({bar=null}={})=>bar; Typescript 3.7.2报告 var条:字符串|空 绑定元素“bar”隐式具有“any”类型。ts(7031) JavaScript代码按我所希望的方式工作,但我如何编写jsdoc提示,以便TypeScript理解解构的bar变量是string | null而不是any?用正确答案更新 发现的问题实际上是您的tsconfig以及Java

鉴于以下情况

/**
*@param{{bar?:字符串| null}}[param0]
*/
常量foo=({bar=null}={})=>bar;
Typescript 3.7.2报告

var条:字符串|空
绑定元素“bar”隐式具有“any”类型。ts(7031)

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

用正确答案更新 发现的问题实际上是您的tsconfig以及JavaScript类型检查如何使用它。导致您的配置与我的配置不同的选项是
strict
属性。根据报告:

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

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

  • --strictNullChecks
  • --strictPropertyInitialization
    (因为没有
    --strictNullChecks
    选项,无法启用它)
当我禁用这两个,它终于对结果感到高兴

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

得出这个结论,这可能是JavaScript类型检查中的一个错误,以及它如何使用这些选项,尽管这些选项似乎都与本例无关

编辑:

我已经检查过了,TypeScript repo上似乎已经记录了一个bug:

以前的解决方案(不起作用) 你应该能够很容易地做到这一点。也许可以删除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"
    ]
}
以下是回购协议,其中包含以下代码,您也可以使用这些代码检查您的回购协议:

测试该脚本的TypeScript版本是3.7.2

编辑:
看看方括号和非方括号,看起来没什么关系。TSC对这两种方式都没有问题。

我仍然看到上面的警告。Typescript 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
时发现的内容更新答案,并提供选项感谢您提供完整的答案。你是最棒的!