Typescript: setTimeout - atribuir id de tempo limite a uma variável gera um erro TS2323: O tipo 'Timer' não pode ser atribuído ao tipo 'número'.

Criado em 7 out. 2014  ·  24Comentários  ·  Fonte: microsoft/TypeScript

Usando tsc v1.1.0-1, obtemos um erro ao compilar:
Erro TS2323: O tipo 'Timer' não pode ser atribuído ao tipo 'número'.

o código a seguir gera o erro de compilação:

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

sTimeout é definido como um número (var privado).

Question

Comentários muito úteis

Em vez disso, use window.setTimeout .

Todos 24 comentários

Por favor, poste um exemplo completo. As informações fornecidas até agora não são suficientes para reproduzir o problema:

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

Não existe um tipo embutido chamado Timer então é provável que o setTimeout você está chamando não seja window.setTimeout .

Deveria ter dado um exemplo - foi um pouco apressado antes. Aqui está:

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

Lança o seguinte erro:

Usando tsc v1.1.0-1
/tests/Foo.ts(5,3): erro TS2323: O tipo 'Timer' não pode ser atribuído ao tipo 'número'.

Por enquanto, resolvi isso usando sTimeout para qualquer.

Isso não se reproduz para mim. O que acontece quando você F12 setTimeout ?

Não tem certeza do que você quer dizer com F12? .

"Vá para a definição"

Novamente, não existe um tipo embutido chamado Timer , então seu código deve estar se referindo a algum outro tipo. Por favor, experimente seu exemplo em um arquivo sozinho, ou descubra de onde em seu projeto este Timer está vindo. Estou supondo que setTimeout não se refere à função interna, mas sim a alguma outra função definida pelo usuário que possui um valor de retorno diferente.

Tentei o exemplo sozinho: parece que é causado por um componente na minha cadeia de ferramentas ou outro código - desculpe por demorar. Obrigado ... Fechado ...

Para leitores futuros, me deparei com esse erro por causa das definições definitivamente digitadas em node.js. A solução é usar o nome completo do tipo, que é NodeJS.Timer não Timer (que infelizmente é o que o transpilador Typescript sugere, e não funciona).

@jdfreder o tempo voa - o futuro está aqui

de qualquer forma, tive o mesmo problema: error TS2352: Neither type 'Timer' nor type 'number' is assignable to the other. embora tenha a referência implícita definida no início do arquivo /// <reference path="node_modules/typescript/lib/lib.d.ts" /> ainda não funciona.

O principal problema é que um de nossos pacotes npm de terceiros (angular2) tem tipificações TS + (nó e outros) incluídos no pacote.

@rixrix (e para qualquer pessoa que encontrar isso) Eu tive um problema semelhante até que percebi que não estava passando os parâmetros corretos.

Compare isso, que requer o segundo parâmetro ms e retorna NodeJS.Timer :

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

... e isso, o que torna o segundo parâmetro timeout opcional e retorna number :

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

Com base nessas duas funções, o TS seleciona corretamente uma sobrecarga apropriada, portanto, se você obter error TS2352: Neither type 'Timer' nor type 'number' is assignable to the other certifique-se de especificar um tempo limite!

Olá @Penryn, obrigado pelo

Acho que meu comentário anterior é uma prova de que não dei detalhes suficientes, pois não me lembro mais dos detalhes exatos sobre a referida mensagem de erro. desculpa.

No topo da minha cabeça, o problema que tínhamos antes era quando fazemos upgrades incrementais de nosso aplicativo da web spin off escrito em Angular2 (versões alfa). Nossa base de código principal (ng1 e ng2) é escrita em TypeScript (com componentes de bower, um monte de outras tipificações e poucas tipificações personalizadas), e Angular2 naquela época também enviava tipificações, tipagens de nós, etc. Com nossas tipagens de nós (desatualizadas versão) e tipificações de nó ng2 (e possivelmente outras tipificações), efetivamente o compilador TS fica confuso sobre tipagens dups. Em nosso caso, poderíamos ter modificado manualmente as tipificações ofensivas, mas é muito trabalhoso saber que em algum momento teremos que retirar a (s) versão (ões) mais recente (s)

Acho que isso foi resolvido nas versões recentes do Angular2, pois teremos que instalar manualmente as tipificações necessárias.

Felicidades

@RyanCavanaugh tem o mesmo problema. Eu vejo que tenho duas definições para setTimeout. Um retorna number e o outro retorna NodeJS.Timer .

Em vez disso, use window.setTimeout .

Por que NodeJS.Timer requer um tipo especial? Ele ainda retornará number certo? Estou esquecendo de algo?

@cchamberlain Node na verdade retorna uma classe Timer inteira: https://nodejs.org/api/timers.html

Portanto, não apenas number neste caso.

@Penryn - TIL 👍

Para os curiosos, o motivo pelo qual isso está acontecendo é que setTimeout em node.js retorna uma coisa diferente de setTimeout dentro do navegador. O setTimeout do navegador apenas retorna um número; em node.js setTimeout retorna um grande objeto Timer.

Portanto, o motivo pelo qual você está vendo esse problema é quase certamente porque você pretendia direcionar a web, mas obteve definições de nós.

@johnfn também pode ser um código isomórfico destinado ao navegador e ao nó de destino.

Para outras pessoas que entram aqui usando setTimeout ou setInterval , use window.setTimeout ou interval para que o tsc saiba que você está usando a função do navegador da web (que retorna número ) e não a função do NodeJS (que retorna outra coisa).

Para adicionar @AskYous , se você tiver @types/node nos pacotes, use window.setInterval para evitar a falha de tipo.

Para quem está usando @angular com @angular-cli certifique-se de ter o nó de tipo em seu tsconfig.app.json também.

Eq:

tsconfig.app.json

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

Eu encontrei aqui: https://stackoverflow.com/a/43952363/3415716

Talvez você tenha importado um pacote que tem uma função com o nome setTimeout() .
Basta usar window.setTimeout vez de setTimeout para resolver o problema :)

no tipo de ambiente de nó é NodeJS.Timer use global.setTimeout
e no ambiente do navegador o tipo é number use window.setTimeout

hoje depois de instalar npm i @types/react @types/react-dom --save-dev

o @types\node vazou para node_modules e, portanto, estava causando o erro Timer

Como @ nippur72 , me deparei com isso hoje com react-dom . Acho que a solução mais simples é atualizar o pacote @types para não depender do Node quando um ambiente de navegador é esperado, portanto: https://github.com/DefinitelyTyped/DefinitelyTyped/issues/21310#issuecomment -367919251

Esta página foi útil?
0 / 5 - 0 avaliações