Typescript: setTimeout-タイムアウトIDを変数に割り当てると、エラーがスローされますTS2323:タイプ「タイマー」はタイプ「番号」に割り当てることができません。

作成日 2014年10月07日  ·  24コメント  ·  ソース: microsoft/TypeScript

tsc v1.1.0-1を使用すると、コンパイル時にエラーが発生します。
エラーTS2323:タイプ「タイマー」はタイプ「番号」に割り当てることができません。

次のコードはコンパイルエラーをスローします:

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

sTimeoutは、数値(private var)として定義されます。

Question

最も参考になるコメント

代わりにwindow.setTimeout使用してください。

全てのコメント24件

完全な例を投稿してください。 これまでに提供された情報は、問題を再現するのに十分ではありません。

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

Timerという組み込み型はないため、呼び出しているsetTimeoutwindow.setTimeoutはない可能性があります。

例を挙げるべきだった-少し前に急いでいた。 どうぞ:

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

次のエラーをスローします。

tscv1.1.0-1の使用
/tests/Foo.ts(5,3):エラーTS2323:タイプ「タイマー」をタイプ「番号」に割り当てることはできません。

今のところ、sTimeoutをanyに入力して、を使用して修正しました。

これは私には再現されません。 F12 setTimeoutするとどうなりますか?

F12の意味がわかりませんか? 。

「定義に移動」

繰り返しますが、 Timerと呼ばれる組み込み型はないため、コードは他の型を参照している必要があります。 ファイル内の例を単独で試してみるか、プロジェクトのどこからこのTimerが来ているのかを把握してください。 setTimeoutは組み込み関数ではなく、戻り値が異なる他のユーザー定義関数を参照していると思います。

例を単独で試してみました。ツールチェーンまたは他のコードのコンポーネントが原因のようです。お時間を割いて申し訳ありません。 ありがとう...閉店...

将来の読者のために、node.jsが明確に型指定された定義のために、このエラーに遭遇しました。 解決策は、タイプのフルネームを使用することです。これは、 NodeJS.TimerではなくTimer (残念ながら、これはTypescriptトランスパイラーが提案するものであり、機能しません)。

@jdfreder時間が飛ぶ-未来はここにある

とにかく私は同じ問題を抱えていました:ファイルの先頭に暗黙の参照が定義されていてもerror TS2352: Neither type 'Timer' nor type 'number' is assignable to the other. /// <reference path="node_modules/typescript/lib/lib.d.ts" />まだ機能しません。

主な問題は、サードパーティのnpmパッケージ(angular2)の1つにTS +タイピング(ノードなど)がパッケージに含まれていることです。

@rixrix (そしてこれを見つけた他の人にとって)私は正しいパラメーターを渡していないことに気付くまで同様の問題を抱えていました。

二番目のパラメータ必要とし、これを比較しmsして返しますNodeJS.Timer

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

...そしてこれは、2番目のパラメータtimeoutオプションにし、 numberを返します:

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

これらの2つの関数に基づいて、TSは適切なオーバーロードを正しく選択するため、 error TS2352: Neither type 'Timer' nor type 'number' is assignable to the other取得した場合は、必ずタイムアウトを指定してください。

こんにちは@Penryn頭を上げてくれてありがとう!

私の以前のコメントは、前述のエラーメッセージの正確な詳細をもう思い出せないため、十分な詳細を提供していないことの証だと思います。 ごめんなさい。

頭に浮かんだのは、以前に発生した問題は、Angular2(アルファリリース)で記述されたスピンオフWebアプリのインクリメンタルアップグレードを行うときでした。 私たちのメインコードベース(ng1とng2)はTypeScriptで書かれており(バウアーコンポーネント、他の多くのタイピング、いくつかのカスタムタイピングを含む)、当時のAngular2はタイピング、ノードタイピングなども出荷していました。ノードタイピング(古い)バージョン)およびng2ノードタイピング(および場合によっては他のタイピング)では、事実上、TSコンパイラは重複タイピングについて混乱します。 私たちの場合、問題のあるタイピングを手動で変更することもできますが、最新バージョンを引き出す必要があることを知っていると、大変な作業になります。

必要なタイピングを手動でインストールする必要があるため、これは最近のAngular2リリースで解決されたと思います。

乾杯

@RyanCavanaughにも同じ問題があります。 setTimeoutには2つの定義があるようです。 いずれかを返しますnumberおよび他のリターンNodeJS.Timer

代わりにwindow.setTimeout使用してください。

NodeJS.Timer特別なタイプが必要なのはなぜですか? それでもnumberを返すだけですよね? 私は何かが足りないのですか?

@cchamberlainノードは実際にはTimerクラス全体を返します: https//nodejs.org/api/timers.html

したがって、この場合はnumberだけではありません。

@Penryn -

好奇心旺盛な人にとって、これが起こっている理由は、node.jsのsetTimeoutがブラウザー内のsetTimeoutは異なるものを返すためです。 ブラウザのsetTimeoutは数値を返すだけです。 node.jsでは、setTimeoutは大きなTimerオブジェクトを返します。

したがって、この問題が発生する理由は、ほぼ確実にWebをターゲットにすることを意図していたが、ノード定義を取得したためです。

@johnfnは、ブラウザとノードをターゲットにすることを目的とした同形コードである可能性もあります。

setTimeoutまたはsetIntervalを使用してここに来る他の人は、 window.setTimeoutまたはintervalを使用して、tscがWebブラウザーの関数(数値を返す)を使用していることを認識できるようにします。 )ではなく、NodeJSの関数(何か他のものを返す)ではありません。

@AskYousに追加するには、パッケージに@types/nodeがある場合は、 window.setIntervalを使用して型の失敗を回避します。

使用している人のために@angularして@angular-cliあなたは上のタイプのノードを持っていることを確認してくださいあなたのtsconfig.app.jsonとしても。

式:

tsconfig.app.json

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

私はここでそれを見つけました: https

setTimeout()という名前の関数を持つパッケージをインポートした可能性があります。
ただ、使用window.setTimeoutの代わりにsetTimeoutの問題を解決するために:)

ノード環境タイプはNodeJS.Timer global.setTimeout使用します
ブラウザ環境のタイプはnumberwindow.setTimeout使用します

今日npm i @types/react @types/react-dom --save-devインストールした後

@types\nodenode_modules @types\nodeリークしたため、 Timerエラーが発生していました

@ nippur72のように、私は今日react-domこれに遭遇しました。 最も簡単な解決策は、ブラウザ環境が予想されるときにノードに依存しないように@typesパッケージを更新することだと思います。したがって、 https

このページは役に立ちましたか?
0 / 5 - 0 評価