summaryrefslogtreecommitdiff
path: root/js
diff options
context:
space:
mode:
Diffstat (limited to 'js')
-rw-r--r--js/timers.ts8
-rw-r--r--js/timers_test.ts15
2 files changed, 23 insertions, 0 deletions
diff --git a/js/timers.ts b/js/timers.ts
index 079e779c4..d12205317 100644
--- a/js/timers.ts
+++ b/js/timers.ts
@@ -179,6 +179,12 @@ function checkThis(thisArg: unknown): void {
}
}
+function checkBigInt(n: unknown): void {
+ if (typeof n === "bigint") {
+ throw new TypeError("Cannot convert a BigInt value to a number");
+ }
+}
+
function setTimer(
cb: (...args: Args) => void,
delay: number,
@@ -224,6 +230,7 @@ export function setTimeout(
delay: number = 0,
...args: Args
): number {
+ checkBigInt(delay);
// @ts-ignore
checkThis(this);
return setTimer(cb, delay, args, false);
@@ -235,6 +242,7 @@ export function setInterval(
delay: number = 0,
...args: Args
): number {
+ checkBigInt(delay);
// @ts-ignore
checkThis(this);
return setTimer(cb, delay, args, true);
diff --git a/js/timers_test.ts b/js/timers_test.ts
index 2b10d9dad..f4757bdb2 100644
--- a/js/timers_test.ts
+++ b/js/timers_test.ts
@@ -244,6 +244,21 @@ test(async function clearTimeoutShouldConvertToNumber(): Promise<void> {
assert(called);
});
+test(function setTimeoutShouldThrowWithBigint(): void {
+ let hasThrown = 0;
+ try {
+ setTimeout((): void => {}, (1n as unknown) as number);
+ hasThrown = 1;
+ } catch (err) {
+ if (err instanceof TypeError) {
+ hasThrown = 2;
+ } else {
+ hasThrown = 3;
+ }
+ }
+ assertEquals(hasThrown, 2);
+});
+
test(function testFunctionName(): void {
assertEquals(clearTimeout.name, "clearTimeout");
assertEquals(clearInterval.name, "clearInterval");