考虑到以下情况
/**
* @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
发布于 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名称中删除方括号。此示例运行良好:
/**
* @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都没问题。
https://stackoverflow.com/questions/59161516
复制相似问题