[英]JSDoc Typescript Checking of Named Default Params
鑒於以下
/**
* @param {{bar?: string|null}} [param0]
*/
const foo = ({bar = null} = {}) => bar;
Typescript 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
屬性。 根據配置文檔:
啟用
--strict
啟用--noImplicitAny
、--noImplicitThis
、--alwaysStrict
、--strictBindCallApply
、--strictNullChecks
、--strictFunctionTypes
和--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 都很好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.