tsc v1.1.0-1を使用すると、コンパイル時にエラーが発生します。
エラーTS2323:タイプ「タイマー」はタイプ「番号」に割り当てることができません。
次のコードはコンパイルエラーをスローします:
this.sTimeout = setTimeout(()=> this.showDelay()、250);
sTimeoutは、数値(private var)として定義されます。
完全な例を投稿してください。 これまでに提供された情報は、問題を再現するのに十分ではありません。
class Foo {
private sTimeout: number;
showDelay() { }
bar() {
setTimeout(() => this.showDelay(), 250);
}
}
Timer
という組み込み型はないため、呼び出しているsetTimeout
はwindow.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
使用します
ブラウザ環境のタイプはnumber
、 window.setTimeout
使用します
今日npm i @types/react @types/react-dom --save-dev
インストールした後
@types\node
がnode_modules
@types\node
リークしたため、 Timer
エラーが発生していました
@ nippur72のように、私は今日react-dom
これに遭遇しました。 最も簡単な解決策は、ブラウザ環境が予想されるときにノードに依存しないように@types
パッケージを更新することだと思います。したがって、 https :
最も参考になるコメント
代わりに
window.setTimeout
使用してください。