[英]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 找到自定義類型定義,它的優先級高於默認類型定義。
解決方案:
"typeRoots":[]
"types": []
解決方法:
window.setTimeout()
window.setTimeout
返回number
。 理想情況下,您希望定義自己的類型以將其與數字區分開來(並防止像+
這樣的操作對計時器沒有意義)。
type TimerHandle = number;
對於其他有此錯誤的人來說,對我有用的是在 tsconfig.js 文件中添加:
"compilerOptions": {
...
"types": [],
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.