命名默认参数的 JSDoc Typescript 检查
JSDoc Typescript Checking of Named Default Params
鉴于以下情况
/**
* @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
?
更新正确答案
发现的问题实际上是您的 tsconfig 以及 JavaScript 类型检查如何与它一起工作。导致您的配置与我的配置不同的选项是 strict
属性。根据 config documentation:
Enabling --strict
enables --noImplicitAny
, --noImplicitThis
, --alwaysStrict
, --strictBindCallApply
, --strictNullChecks
, --strictFunctionTypes
and --strictPropertyInitialization
.
将这些选项中的每一个添加到我的 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
}
我的 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 都很好。
鉴于以下情况
/**
* @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
?
更新正确答案
发现的问题实际上是您的 tsconfig 以及 JavaScript 类型检查如何与它一起工作。导致您的配置与我的配置不同的选项是 strict
属性。根据 config documentation:
Enabling
--strict
enables--noImplicitAny
,--noImplicitThis
,--alwaysStrict
,--strictBindCallApply
,--strictNullChecks
,--strictFunctionTypes
and--strictPropertyInitialization
.
将这些选项中的每一个添加到我的 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
}
我的 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 都很好。