簡體   English   中英

JSDoc Typescript 檢查命名默認參數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM