Vyhledávání na webu

Jaký návratový typ by měl být použit pro setTimeout v TypeScriptu?


Zvažte následující kód:

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

Typescript vrací chybu: Typ 'Timer' nelze přiřadit k typu 'number'. Rychlé vyhledání mi říká, že setTimeout vrací NodeJS.Timer.

Ale pokud dělám vývoj založený na prohlížeči, používání NodeJS.Timer se zdá špatné. Která je správná definice typu nebo návratový typ pro použití setTimeout bez použití deklarace any?

Odpověď č. 1

Nejjednodušší řešení je nechat fungovat odvozování typu a vůbec žádný typ nespecifikovat. Pokud potřebujete specifikovat typ, vzhledem k tomu, že typ není konzistentní mezi deklaracemi pro prohlížeč a node, můžete použít ReturnType k určení, že typ proměnné je jakýkoli návratový typ setTimeout:

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

Alternativně lze místo pouhého setTimeout použít také window.setTimeout. Vrací správný návratový typ.

Odpověď č. 2

Můžete použít window.setTimeout, vrací typ number.

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

Odpověď č. 3

K tomu dochází, protože Typescript bude hledat všechny definice typů v node_modules/@types

Pokud jste nainstalovali typovou definici NodeJS (součástí mnoha npm balíčků) do ~/node_modules/@types/node/globals.ts a váš projekt je v ~/Projects/myproject, definice NodeJS pro setTimeout se budou šířit.

Ve výchozím nastavení jsou do vaší kompilace zahrnuty všechny viditelné balíčky „@types“. Balíčky v adresáři node_modules/@types jakékoli nadřazené složky se považují za viditelné; konkrétně to znamená balíčky v ./node_modules/@types/, ../node_modules/@types/, ../../node_modules/@types/ a tak dále.

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

Pokud Typescript najde vlastní definice typů, mají přednost před výchozími definicemi typů.

Řešení:

  • Určete compilerOption, které cesty prohledávat pro definice typů: "typeRoots":[]
  • Uveďte compilerOption, které typové definice se mají načíst z výchozích cest: "types": []
  • Odstraňte soubor definic z výchozích cest hledání

Obejití:

  • Použijte window.setTimeout() místo toho

Související články