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).
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
Comentários muito úteis
Em vez disso, use
window.setTimeout
.