首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >命名缺省参数的JSDoc类型记录检查

命名缺省参数的JSDoc类型记录检查
EN

Stack Overflow用户
提问于 2019-12-03 16:34:01
回答 1查看 327关注 0票数 4

考虑到以下情况

代码语言:javascript
运行
复制
/**
 * @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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-03 18:23:08

有正确答案的更新

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

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

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

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

当我把这两个人弄残的时候,它终于对结果感到满意了。

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

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

编辑:

我已经检查过了,看起来已经在TypeScript回购程序中记录了一个bug:

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

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

你应该能轻松地做到这一点。也许可以从jsdoc注释中的param名称中删除方括号。此示例运行良好:

代码语言:javascript
运行
复制
/**
 * @param {{bar?: number|null}} _
 */
const foo = ({ bar = null } = {}) => {
    // do stuff with bar
}

我所拥有的tsconfig如下所示:

代码语言:javascript
运行
复制
{
    "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都没问题。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59161516

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档