Typescript: setTimeout: asignar un ID de tiempo de espera a una variable arroja un error TS2323: El tipo 'Timer' no se puede asignar al tipo 'número'.

Creado en 7 oct. 2014  ·  24Comentarios  ·  Fuente: microsoft/TypeScript

Usando tsc v1.1.0-1 obtenemos un error al compilar:
error TS2323: El tipo 'Temporizador' no se puede asignar al tipo 'número'.

el siguiente código arroja el error de compilación:

this.sTimeout = setTimeout (() => this.showDelay (), 250);

sTimeout se define como un número (var privada).

Question

Comentario más útil

Simplemente use window.setTimeout lugar.

Todos 24 comentarios

Publique un ejemplo completo. La información proporcionada hasta ahora no es suficiente para reproducir el problema:

class Foo {
    private sTimeout: number;
    showDelay() { }
    bar() {
        setTimeout(() => this.showDelay(), 250);
    }
}

No hay un tipo incorporado llamado Timer por lo que es probable que el setTimeout que llama no sea window.setTimeout .

Debería haber dado un ejemplo - se apresuró un poco antes. Aqui tienes:

class Foo {
    private sTimeout: number; // Storing Timeout ID - to clear it - if needed
    private showDelay() { }
    constructor() {
        this.sTimeout = setTimeout(() => this.showDelay(), 250);
    }
}

Lanza el siguiente error:

Usando tsc v1.1.0-1
/tests/Foo.ts(5,3): error TS2323: El tipo 'Temporizador' no se puede asignar al tipo 'número'.

Por ahora lo he solucionado escribiendo sTimeout en any.

Esto no me reprocha. ¿Qué sucede cuando F12 setTimeout ?

¿No estás seguro de lo que quieres decir con F12? .

"Ir a la definición"

Nuevamente, no hay un tipo incorporado llamado Timer , por lo que su código debe referirse a algún otro tipo. Pruebe su ejemplo en un archivo por sí mismo, o averigüe de dónde viene este Timer en su proyecto. Supongo que setTimeout no se refiere a la función incorporada, sino a otra función definida por el usuario que tiene un valor de retorno diferente.

Probé el ejemplo por sí mismo: parece que es causado por un componente en mi cadena de herramientas u otro código, lo siento por tomarte tu tiempo. Gracias ... Cerrado ...

Para los futuros lectores, encontré este error debido a las definiciones definidas de node.js. La solución es usar el nombre completo del tipo, que es NodeJS.Timer no Timer (que lamentablemente es lo que sugiere el transpilador de TypeScript, y no funciona).

@jdfreder el tiempo vuela - el futuro está aquí

de todos modos tuve el mismo problema: error TS2352: Neither type 'Timer' nor type 'number' is assignable to the other. aunque tengo la referencia implícita definida en la parte superior del archivo /// <reference path="node_modules/typescript/lib/lib.d.ts" /> todavía no funciona.

El principal problema es que uno de nuestros paquetes npm de terceros (angular2) tiene tipificaciones TS + (nodo y otras) incluidas en el paquete.

@rixrix (y para cualquier otra persona que encuentre esto) Tuve un problema similar hasta que me di cuenta de que no estaba pasando los parámetros correctos.

Compare esto, que requiere el segundo parámetro ms y devuelve NodeJS.Timer :

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

... y esto, que hace que el segundo parámetro timeout opcional y devuelve un number :

function setTimeout(handler: any, timeout?: any, ...args: any[]): number;

Basándose en estas dos funciones, TS selecciona correctamente una sobrecarga adecuada, así que si obtiene error TS2352: Neither type 'Timer' nor type 'number' is assignable to the other asegúrese de especificar un tiempo de espera!

Hola @Penryn, ¡ gracias por el

Creo que mi comentario anterior es un testimonio de que no he dado suficientes detalles, ya que ya no puedo recordar los detalles exactos sobre dicho mensaje de error. lo siento.

En la parte superior de mi cabeza, el problema que teníamos antes era cuando realizamos actualizaciones incrementales de nuestra aplicación web derivada escrita en Angular2 (versiones alfa). Nuestra base de código principal (ng1 y ng2) está escrita en TypeScript (con componentes de bower, muchos otros tipos de mecanografía y pocas mecanografías personalizadas), y Angular2 en ese momento también enviaba mecanografía, mecanografía de nodo, etc. Con nuestras mecanografía de nodo (obsoleta version) y tipificaciones de nodos ng2 (y posiblemente otras tipificaciones), efectivamente el compilador TS se confunde con las tipificaciones de dups. En nuestro caso, podríamos haber modificado manualmente los mecanografiados ofensivos, pero es demasiado trabajo sabiendo que en algún momento tendremos que sacar las últimas versiones.

Creo que esto se ha resuelto en las últimas versiones de Angular2, ya que tendremos que instalar manualmente los tipos necesarios.

salud

@RyanCavanaugh tiene el mismo problema. Miro, tengo dos definiciones para setTimeout. Uno devuelve number y el otro devuelve NodeJS.Timer .

Simplemente use window.setTimeout lugar.

¿Por qué NodeJS.Timer requiere un tipo especial? Todavía va a devolver un number ¿verdad? ¿Me estoy perdiendo de algo?

@cchamberlain Node en realidad devuelve una clase Timer completa: https://nodejs.org/api/timers.html

Entonces, no solo un number en este caso.

@Penryn - TIL 👍

Para aquellos curiosos, la razón por la que esto está sucediendo es que setTimeout en node.js devuelve algo diferente a setTimeout dentro del navegador. El setTimeout del navegador solo devuelve un número; en node.js setTimeout devuelve un objeto Timer grande.

Entonces, la razón por la que está viendo este problema es casi con certeza porque ha intentado apuntar a la web, pero ha introducido definiciones de nodo.

@johnfn también podría ser un código isomórfico destinado al navegador y al nodo.

Para otros que ingresen aquí usando setTimeout o setInterval , use window.setTimeout o interval para que tsc sepa que está usando la función del navegador web (que devuelve el número ) y no la función de NodeJS (que devuelve algo más).

Para agregar a @AskYous , si tiene @types/node en los paquetes, use window.setInterval para evitar el error de tipo.

Para quién está usando @angular con @angular-cli asegúrese de tener el nodo de tipo en su tsconfig.app.json también.

Ecuación:

tsconfig.app.json

{
  "extends": "../tsconfig.json",
  "compilerOptions": {
    "outDir": "../out-tsc/app",
    "module": "es6",
    "baseUrl": "",
    "types": ["node"] --> ADD THIS
  },
  "exclude": [
    "test.ts",
    "**/*.spec.ts"
  ]
}

Lo encontré aquí: https://stackoverflow.com/a/43952363/3415716

Tal vez haya importado un paquete que tenga una función con el nombre setTimeout() .
Simplemente use window.setTimeout lugar de setTimeout para resolver el problema :)

en el tipo de entorno de nodo es NodeJS.Timer use global.setTimeout
y en el tipo de entorno del navegador es number use window.setTimeout

hoy después de instalar npm i @types/react @types/react-dom --save-dev

el @types\node filtró en node_modules y, por lo tanto, estaba causando el error Timer

Como @ nippur72 , me encontré con esto hoy con react-dom . Creo que la solución más simple es actualizar el paquete @types para no depender de Node cuando se espera un entorno de navegador, por lo tanto: https://github.com/DefinitelyTyped/DefinitelyTyped/issues/21310#issuecomment -367919251

¿Fue útil esta página
0 / 5 - 0 calificaciones