diff --git a/.changeset/young-terms-wink.md b/.changeset/young-terms-wink.md
new file mode 100644
index 000000000..330a8fda8
--- /dev/null
+++ b/.changeset/young-terms-wink.md
@@ -0,0 +1,5 @@
+---
+"@effect/schema": patch
+---
+
+int filter: use Number.isSafeInteger instead of Number.isInteger
diff --git a/src/Schema.ts b/src/Schema.ts
index 1f9d82873..506b64d33 100644
--- a/src/Schema.ts
+++ b/src/Schema.ts
@@ -1973,7 +1973,7 @@ export const IntTypeId = Symbol.for("@effect/schema/TypeId/Int")
export const int =
(options?: FilterAnnotations) => (self: Schema): Schema =>
self.pipe(
- filter((a): a is A => Number.isInteger(a), {
+ filter((a): a is A => Number.isSafeInteger(a), {
typeId: IntTypeId,
description: "integer",
jsonSchema: { type: "integer" },
diff --git a/test/Schema/fromBrand.test.ts b/test/Schema/fromBrand.test.ts
index 2f0f318f4..854a86c0f 100644
--- a/test/Schema/fromBrand.test.ts
+++ b/test/Schema/fromBrand.test.ts
@@ -4,7 +4,7 @@ import * as Util from "@effect/schema/test/util"
type Int = number & Brand.Brand<"Int">
const Int = Brand.refined(
- (n) => Number.isInteger(n),
+ (n) => Number.isSafeInteger(n),
(n) => Brand.error(`Expected ${n} to be an integer`)
)
diff --git a/test/number/int.test.ts b/test/number/int.test.ts
index 5d29762f8..1315738ac 100644
--- a/test/number/int.test.ts
+++ b/test/number/int.test.ts
@@ -3,7 +3,7 @@ import * as Pretty from "@effect/schema/Pretty"
import * as S from "@effect/schema/Schema"
import * as Util from "@effect/schema/test/util"
-const schema = S.number.pipe(S.int())
+const schema = S.Int
describe("number/int", () => {
it("property tests", () => {
@@ -15,6 +15,8 @@ describe("number/int", () => {
expect(is(0)).toEqual(true)
expect(is(1)).toEqual(true)
expect(is(0.5)).toEqual(false)
+ expect(is(Number.MAX_SAFE_INTEGER + 1)).toEqual(false)
+ expect(is(Number.MIN_SAFE_INTEGER - 1)).toEqual(false)
})
it("decoding", async () => {