簡體   English   中英

TypeScript 中的 setTimeout 應該使用什么返回類型?

[英]What return type should be used for setTimeout in TypeScript?

考慮以下代碼:

const timer: number = setTimeout(() => '', 1000);

Typescript 拋出錯誤: Type 'Timer' is not assignable to type 'number'. 快速查找告訴我setTimeout返回NodeJS.Timer

但是如果我在做基於瀏覽器的開發,使用NodeJS.Timer感覺不對。 哪個是正確的類型定義或返回類型,可以在不訴諸any聲明的情況下使setTimeout工作?

最簡單的解決方案是允許類型推斷起作用並且根本不指定任何類型。 如果您需要指定類型,因為瀏覽器和節點聲明之間的類型不一致,您可以使用ReturnType指定變量的類型是setTimeout的返回類型是什么:

const timer: ReturnType<typeof setTimeout> = setTimeout(() => '', 1000);

或者,也可以使用window.setTimeout而不僅僅是setTimeout 它返回正確的返回類型。

您可以使用window.setTimeout它返回一個number類型。

let a: number;
a = window.setTimeout(function() {}, 0);

發生這種情況是因為 Typescript 將搜索node_modules/@types下的所有類型定義

如果您將 NodeJS 類型定義(帶有許多 npm 包)安裝到~/node_modules/@types/node/globals.ts並且您的項目位於~/Projects/myproject中,則setTimeout的 NodeJS 定義將泄漏。

默認情況下,所有可見的“@types”包都包含在您的編譯中。 任何封閉文件夾的 node_modules/@types 中的包都被認為是可見的; 具體來說,這意味着 ./node_modules/@types/、../node_modules/@types/、../../node_modules/@types/ 等中的包。

見: https ://www.typescriptlang.org/tsconfig#types

如果 Typescript 找到自定義類型定義,它的優先級高於默認類型定義。 setTimeout() 的 VS Code 2 類型定義

解決方案:

  • 指定 compilerOption 搜索類型定義的路徑: "typeRoots":[]
  • 指定 compilerOption 從默認路徑加載哪些類型定義: "types": []
  • 從默認搜索路徑中刪除定義文件

解決方法:

  • 改用window.setTimeout()

window.setTimeout返回number 理想情況下,您希望定義自己的類型以將其與數字區分開來(並防止像+這樣的操作對計時器沒有意義)。

type TimerHandle = number;

對於其他有此錯誤的人來說,對我有用的是在 tsconfig.js 文件中添加:

"compilerOptions": {

   ...
   "types": [],
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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