Ich arbeite daran, alten TypeScript-Code auf die neueste Compiler-Version zu aktualisieren, und habe Probleme mit einem Aufruf von setTimeout
. Der Code erwartet, die Browserfunktion aufzurufen, die setTimeout
eine Nummer zurückgibt:
setTimeout(handler: (...args: any[]) => void, timeout: number): number;
Der Compiler löst dies jedoch stattdessen in der Knotenimplementierung auf, die einen NodeJS.Timer zurückgibt:
setTimeout(callback: (...args: any[]) => void, ms: number, ...args: any[]): NodeJS.Timer;
Dieser Code wird nicht im Knoten ausgeführt, aber die Knotentypisierungen werden als Abhängigkeit von etwas anderem abgerufen (nicht sicher, was).
Wie kann ich den Compiler anweisen, die setTimeout
gewünschte Version auszuwählen ?
Hier ist der fragliche Code:
let n: number;
n = setTimeout(function () { /* snip */ }, 500);
Dies erzeugt den Compilerfehler:
TS2322: Der Typ 'Timer' kann nicht dem Typ 'Nummer' zugewiesen werden.
quelle
Antworten:
Eine weitere Problemumgehung, die sich nicht auf die Variablendeklaration auswirkt:
Es sollte auch möglich sein, das
window
Objekt explizit zu verwenden, ohneany
:quelle
window.setTimeout
) sollte die richtige Antwort auf diese Frage sein, da es die klarste Lösung ist.any
Typ verwenden, geben Sie keine TypeScript-Antwort.number
Typ zu TypeScript-spezifischen Flusenfehlern, da diesetTimeout
Funktion mehr erfordert.window.setTimeout
kann Probleme mit Unit-Test-Frameworks (node.js) verursachen. Die beste Lösung istlet n: NodeJS.Timeout
undn = setTimeout
.Durch die Verwendung erhalten
ReturnType<fn>
Sie Unabhängigkeit von der Plattform. Sie werden nicht gezwungen zu verwendenany
oderwindow.setTimeout
was wird brechen, wenn Sie den Code no nodeJS Server ausführen (z. B. serverseitig gerenderte Seite).Gute Nachrichten, das ist auch mit Deno kompatibel!
quelle
setTimeout
/ unterstütztclearTimeout
und nicht verwendetany
.NodeJS.Timeout
beisetTimeout
direkter Verwendung undnumber
bei Verwendungwindow.setTimeout
. Sollte nicht nötig seinReturnType
.setTimeout
Funktion ausführen und erwarten, dass das Ergebnis in der Variablen gespeichert wird. Probieren Sie es selbst auf dem TS-Spielplatz.Ich denke, es hängt davon ab, wo Sie Ihren Code ausführen werden.
Wenn Ihr Laufzeitziel der serverseitige Node JS ist, verwenden Sie:
Wenn Ihr Laufzeitziel ein Browser ist, verwenden Sie:
quelle
Ich hatte das gleiche Problem und die Problemumgehung, für die sich unser Team entschieden hat, bestand darin, "any" für den Timer-Typ zu verwenden. Z.B:
Es funktioniert mit beiden Implementierungen der Methoden setTimeout / setInterval / clearTimeout / clearInterval.
quelle
window.setTimeout
funktioniert möglicherweise nicht mit Unit-Test-Frameworks. Es gibt einen Typ, der hier verwendet werden kannNodeJS.Timeout
. Sie denken vielleicht, Sie befinden sich nicht in einer Knotenumgebung, aber ich habe Neuigkeiten für Sie: Webpack / TypeScript usw. führen node.js aus.Dies wird wahrscheinlich mit älteren Versionen funktionieren, aber mit TypeScript-Version
^3.5.3
und Node.js-Version^10.15.3
sollten Sie in der Lage sein, die knotenspezifischen Funktionen aus dem Timer- Modul zu importieren , dh:Dadurch wird eine Instanz von Timeout vom Typ zurückgegeben
NodeJS.Timeout
, an die Sie übergeben könnenclearTimeout
:quelle
setTimeout
etwas wieconst { setTimeout } = window
behoben.Wenn Sie hier eine echte Lösung für Typoskripte über Timer suchen, gehen wir wie folgt vor:
Fehler ist im Rückgabetyp 'Nummer', es ist kein Timer oder irgendetwas anderes.
Dies ist für Typoskripte Version ~> 2.7 Lösung:
Jetzt haben wir alle behoben, erklären Sie einfach so:
quelle