[解決済み】TypeScript - 正しいバージョンのsetTimeoutを使用する(ノードとウィンドウの比較)
質問
古いTypeScriptのコードを最新のコンパイラバージョンにアップグレードしているのですが、その際に
setTimeout
. このコードでは、ブラウザの
setTimeout
という関数があり、これは数値を返します。
setTimeout(handler: (...args: any[]) => void, timeout: number): number;
しかし、コンパイラはこれをノード実装に解決し、NodeJS.Timerを返します。
setTimeout(callback: (...args: any[]) => void, ms: number, ...args: any[]): NodeJS.Timer;
このコードはnodeで実行されませんが、nodeの型付けは何か他のもの(何かは不明)への依存として引き込まれています。
のバージョンを選択するようにコンパイラに指示するにはどうすればよいでしょうか?
setTimeout
を使用したいのですが?
以下は問題のコードです。
let n: number;
n = setTimeout(function () { /* snip */ }, 500);
これは、コンパイラーエラーを発生させます。
TS2322: タイプ 'Timer' はタイプ 'number' に割り当てられません。
解決方法は?
2021年版アップデート
Akxeの回答
提案する
ReturnType<Type>
のテクニックは、Typescript 2.3 で導入されました。
let n: ReturnType<typeof setTimeout>;
n = setTimeout(cb, 500);
これは素晴らしいことで、明示的なキャストよりも好まれるようです。しかし、この場合の "n" の結果型は "NodeJS.Timeout" であり、以下のように使用することが可能です。
let n: NodeJS.Timeout;
n = setTimeout(cb, 500);
ReturnType/NodeJS.Timeoutアプローチの唯一の問題は、ブラウザ固有の環境での数値演算はまだキャストを必要とすることです。
if ((n as unknown as number) % 2 === 0) {
clearTimeout(n);
}
オリジナルの回答
変数宣言に影響を与えない回避策です。
let n: number;
n = setTimeout(function () { /* snip */ }, 500) as unknown as number;
また、ブラウザ固有の環境下では
window
オブジェクトをキャストせずに使用することができます。
let n: number;
n = window.setTimeout(function () { /* snip */ }, 500);
関連
-
[解決済み】「TS2532: Object is possibly 'undefined'」というエラーを解決するにはどうしたらいいですか?
-
[解決済み] エラー TS2322: タイプ 'Object[]' はタイプ '[Object]' に割り当てられません。
-
ts 学習日記1 AssertionError [ERR_ASSERTION]: タスク関数を指定する必要があります
-
[解決済み] TypeScriptのハッシュマップ/辞書インターフェイス
-
[解決済み] Jestで関数をモックする方法
-
[解決済み] 'タイプ 'never'にプロパティが存在しません。
-
[解決済み] クラスのプロパティが整数であることはどのように指定するのですか?
-
[解決済み] TypeScript で `window` に新しいプロパティを明示的に設定するにはどうすればよいですか?
-
[解決済み] Typescript は ?演算子をサポートしていますか?(そして、それは何と呼ばれているのでしょうか?)
-
[解決済み] [Solved] setTimeoutコールバックに正しい "this "コンテキストを渡すか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Typescript : require文はimport文の一部ではない
-
[解決済み】Typescriptで、! (エクスクラメーションマーク/バン)演算子でメンバを再参照するのは?
-
[解決済み] webpack のアップグレード後、名前空間 NodeJS が見つからない
-
[解決済み] TypeScriptの円形型参照
-
[解決済み] TypeScriptのsetTimeoutはどのような戻り値型を使用すればよいですか?
-
[解決済み] TypeScriptで文字列を数値に変換する方法とは?
-
[解決済み] クラス定数を実装するには?
-
[解決済み] TypeScriptの "*.d.ts "について
-
[解決済み] Typescript オブジェクトのインデックス付きメンバの型を強制する?
-
[解決済み] async/await構文で拒否する方法は?