220 votes

TypeScript - utilise la version correcte de setTimeout (noeud ou fenêtre)

Je suis en train de travailler sur la mise à niveau de certains vieux Tapuscrit code à utiliser la dernière version de compilateur, et j'ai de la difficulté avec un appel à l' setTimeout. Le code devrait appeler le navigateur setTimeout fonction qui retourne un nombre:

setTimeout(handler: (...args: any[]) => void, timeout: number): number;

Cependant, le compilateur est la résolution de cette le nœud de mise en place, qui renvoie un NodeJS.Timer:

setTimeout(callback: (...args: any[]) => void, ms: number, ...args: any[]): NodeJS.Timer;

Ce code n'est pas exécuté dans le nœud, mais le nœud typings obtenez tiré comme une dépendance à quelque chose d'autre (je ne sais pas quoi).

Comment puis-je demander au compilateur de choisir la version de l' setTimeout que je veux?

Voici le code en question:

let n: number;
n = setTimeout(function () { /* snip */  }, 500);

Ce qui produit l'erreur du compilateur:

TS2322: Type de Minuterie n'est pas cessible de type "nombre".

253voto

Akxe Points 1258

Je suggérerais d'utiliser x: ReturnType<typeof setTimeout>; car cela fonctionnera réellement indépendamment de la plate-forme utilisée.

197voto

dhilt Points 7074

Une autre solution de contournement qui n'affecte pas la déclaration de variable:

 let n: number;
n = <any>setTimeout(function () { /* snip */  }, 500);
 

En outre, il devrait être possible d'utiliser l'objet window explicitement sans any :

 let n: number;
n = window.setTimeout(function () { /* snip */  }, 500);
 

31voto

cwouter Points 101

Je suppose que cela dépend de l'endroit où vous allez exécuter votre code.

Si votre cible d'exécution est le nœud JS côté serveur, utilisez:

 let timeout: NodeJS.Timeout;
global.clearTimeout(timeout);
 

Si votre cible d'exécution est un navigateur, utilisez:

 let timeout: number;
window.clearTimeout(timeout);
 

0voto

Nikola Lukic Points 22
  • Si vous voulez une vraie solution pour les textes sur les minuteries, nous allons

    Le bogue est dans le type de retour 'numéro' ce n'est pas Timer ou autre chose.

    Ceci concerne la solution dactylographiée version ~> 2.7:

export type Tick = null | number | NodeJS.Timer;

Maintenant, nous avons corrigé tout le jute déclaré comme ceci:

  import { Tick } from "../../globals/types";

 export enum TIMER {
    INTERVAL = "INTERVAL",
    TIMEOUT = "TIMEOUT", 
 };

 interface TimerStateI {
   timeInterval: number;
 }

 interface TimerI: TimerStateI {
   type: string;
   autoStart: boolean;
 }

     class myTimer extends React.Component<TimerI, TimerStateI > {

          private myTimer: Tick = null;
          private myType: string = TIMER.INTERVAL;

          constructor(args){
             super(args);
             this.setState({timeInterval: args.timeInterval});

             if (args.autoStart === true){
               this.startTimer();
             }
          }

          private myTick = () => {
            console.log("Tick");
          }    

          private startTimer = () => {
            if (this.myType === TIMER.INTERVAL) {
              this.myTimer = setInterval(this.myTick, this.timeInterval);
            } else if (this.myType === TIMER.TIMEOUT) {
               this.myTimer = setTimeout(this.myTick, this.timeInterval);
            }



          }

     ...
     }
 

-1voto

Mark Dolbyrev Points 1371

J'ai rencontré le même problème et la solution de contournement que notre équipe a décidé d'utiliser consistait simplement à utiliser "any" pour le type de minuterie. Par exemple:

 let n: any;
n = setTimeout(function () { /* snip */  }, 500);
 

Cela fonctionnera avec les deux implémentations des méthodes setTimeout / setInterval / clearTimeout / clearInterval.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X