TypeScriptで正しいsetTimeoutを使用する: Node.jsとブラウザの違い
TypeScriptでsetTimeout
を使用する際に、Node.jsとブラウザ環境の違いを考慮する必要があります。両環境ではsetTimeout
の型定義が異なるため、適切な型を指定してエラーを防ぐことが重要です。
Node.js環境
Node.jsでは、setTimeout
の型は以下のように定義されています。
declare function setTimeout(callback: (...args: any[]) => void, ms?: number, ...args: any[]): NodeJS.Timeout;
- 戻り値
NodeJS.Timeout
オブジェクト。このオブジェクトを使用してタイマーをクリアすることができます。 ...args
:callback
関数に渡される引数。ms
: 遅延時間(ミリ秒)。callback
: 遅延後に実行される関数。
ブラウザ環境
declare function setTimeout(handler: (...args: any[]) => void, timeout?: number, ...args: any[]): number;
- 戻り値
タイマーのID。このIDを使用してタイマーをクリアすることができます。 timeout
: 遅延時間(ミリ秒)。handler
: 遅延後に実行される関数。
適切な型指定
Node.jsとブラウザ環境でsetTimeout
を使用する際には、それぞれの型定義に合わせて適切な型を指定する必要があります。
import { setTimeout } from 'node:timers';
const timeoutId = setTimeout(() => {
console.log('Hello from Node.js!');
}, 2000);
// タイマーをクリア
clearTimeout(timeoutId);
ブラウザ
const timeoutId = setTimeout(() => {
console.log('Hello from browser!');
}, 2000);
// タイマーをクリア
clearTimeout(timeoutId);
注意
- ブラウザ環境では、グローバルスコープで
setTimeout
が定義されています。 - Node.js環境では、
node:timers
モジュールからsetTimeout
をインポートする必要があります。
import { setTimeout } from 'node:timers';
// 2秒後にメッセージを表示
const timeoutId = setTimeout(() => {
console.log('Hello from Node.js!');
}, 2000);
// 5秒後にタイマーをクリア
setTimeout(() => {
clearTimeout(timeoutId);
console.log('Timer cleared.');
}, 5000);
解説
node:timers
モジュールからsetTimeout
をインポートします。setTimeout
を使用して、2秒後にメッセージを表示するタイマーを設定します。setTimeout
を使用して、5秒後にclearTimeout
でタイマーをクリアします。
// 2秒後にメッセージを表示
const timeoutId = setTimeout(() => {
console.log('Hello from browser!');
}, 2000);
// 5秒後にタイマーをクリア
setTimeout(() => {
clearTimeout(timeoutId);
console.log('Timer cleared.');
}, 5000);
- ブラウザ環境では、
setTimeout
がグローバルスコープで定義されているため、インポートは不要です。
共通点
clearTimeout
を使用してタイマーをクリアすることができます。- 両環境で
setTimeout
の使い方は基本的には同じです。
import { setInterval } from 'node:timers';
let count = 0;
const intervalId = setInterval(() => {
console.log('Count:', count++);
if (count === 5) {
clearInterval(intervalId);
}
}, 1000);
clearInterval
を使用して間隔をクリアします。setInterval
は指定した間隔で繰り返し関数を呼び出します。
Promiseを使用
const delay = (ms: number) => new Promise<void>(resolve => setTimeout(resolve, ms));
delay(2000)
.then(() => console.log('Hello from Node.js!'))
.catch(error => console.error(error));
setTimeout
を内部で使用して遅延を実現します。Promise
を使用して非同期処理を管理します。
let count = 0;
const intervalId = setInterval(() => {
console.log('Count:', count++);
if (count === 5) {
clearInterval(intervalId);
}
}, 1000);
- ブラウザ環境でも
setInterval
は同じように使用できます。
const delay = (ms: number) => new Promise<void>(resolve => setTimeout(resolve, ms));
delay(2000)
.then(() => console.log('Hello from browser!'))
.catch(error => console.error(error));
- ブラウザ環境でも
Promise
は同じように使用できます。
- Node.jsとブラウザ環境でこれらの代替方法を使用することができます。
Promise
は非同期処理を管理する際に便利です。setInterval
は繰り返し処理に適しています。
typescript settimeout