JSDoc Typescript检查命名默认参数

时间:2019-12-03 16:34:01

标签: javascript typescript jsdoc checkjs

给出以下内容

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

打字稿3.7.2报告

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

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

1 个答案:

答案 0 :(得分:5)

更新正确答案

发现的问题实际上是您的tsconfig以及JavaScript类型检查如何与其一起工作。导致您的配置和我的配置之间存在差异的选项是strict属性。根据{{​​3}}:

  

启用--strict会启用--noImplicitAny--noImplicitThis--alwaysStrict--strictBindCallApply--strictNullChecks--strictFunctionTypes和{{1} }。

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

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

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

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

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

编辑:

我已经检查过,看来在TypeScript存储库中已经为此记录了一个错误:

config documentation

先前的解决方案(无效)

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

string|null

我的tsconfig看起来像这样:

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

以下是具有以下代码的存储库,您也可以使用此代码进行检查: https://github.com/microsoft/TypeScript/issues/31372

测试过的TypeScript版本是3.7.2

编辑: 检出方括号和非方括号,看起来好像没关系。无论哪种方式,TSC都可以。