From 7e88ec58405e88fd38d0281bf59e97a1dea8429b Mon Sep 17 00:00:00 2001 From: Chris Wilkinson Date: Mon, 20 Jul 2026 10:07:32 +0100 Subject: [PATCH 1/2] Refine existing type in Predicated.isTagged --- .changeset/funny-drinks-scream.md | 5 +++++ packages/effect/src/Predicate.ts | 4 ++-- packages/effect/typetest/Predicate.tst.ts | 8 +++++++- 3 files changed, 14 insertions(+), 3 deletions(-) create mode 100644 .changeset/funny-drinks-scream.md diff --git a/.changeset/funny-drinks-scream.md b/.changeset/funny-drinks-scream.md new file mode 100644 index 00000000000..cb582701040 --- /dev/null +++ b/.changeset/funny-drinks-scream.md @@ -0,0 +1,5 @@ +--- +"effect": patch +--- + +Refine existing type in Predicated.isTagged diff --git a/packages/effect/src/Predicate.ts b/packages/effect/src/Predicate.ts index b5ac5040cdc..b6f10388a4d 100644 --- a/packages/effect/src/Predicate.ts +++ b/packages/effect/src/Predicate.ts @@ -1164,8 +1164,8 @@ export const hasProperty: { * @since 2.0.0 */ export const isTagged: { - (tag: K): (self: unknown) => self is { _tag: K } - (self: unknown, tag: K): self is { _tag: K } + (tag: K): (self: T) => self is T extends {} ? Extract : T & { _tag: K } + (self: T, tag: K): self is T extends {} ? Extract : T & { _tag: K } } = dual( 2, (self: unknown, tag: K): self is { _tag: K } => hasProperty(self, "_tag") && self["_tag"] === tag diff --git a/packages/effect/typetest/Predicate.tst.ts b/packages/effect/typetest/Predicate.tst.ts index dc74a61d31d..a891aa33818 100644 --- a/packages/effect/typetest/Predicate.tst.ts +++ b/packages/effect/typetest/Predicate.tst.ts @@ -7,6 +7,8 @@ declare const unknowns: ReadonlyArray declare const numberOrNull: ReadonlyArray declare const numberOrUndefined: ReadonlyArray declare const numberOrNullOrUndefined: ReadonlyArray +declare const tags: ReadonlyArray<{ _tag: "a"; a: string } | { _tag: "b"; b: string }> +declare const tagsOrNumbers: ReadonlyArray<{ _tag: "a"; a: string } | { _tag: "b"; b: string } | number> describe("Predicate", () => { it("isString", () => { @@ -56,7 +58,11 @@ describe("Predicate", () => { }) it("isTagged", () => { - expect(anys.filter(Predicate.isTagged("a"))).type.toBe>() + expect(anys.filter(Predicate.isTagged("a"))).type.toBe>() + expect(unknowns.filter(Predicate.isTagged("a"))).type.toBe>() + expect(tags.filter(Predicate.isTagged("a"))).type.toBe>() + expect(tagsOrNumbers.filter(Predicate.isTagged("a"))).type.toBe>() + expect(numberOrNull.filter(Predicate.isTagged("a"))).type.toBe>() }) it("isNullish", () => { From 78253379423a57e36cdf0f0c07601747a6f0e5e5 Mon Sep 17 00:00:00 2001 From: Chris Wilkinson Date: Mon, 20 Jul 2026 10:20:10 +0100 Subject: [PATCH 2/2] Correct module name --- .changeset/funny-drinks-scream.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/funny-drinks-scream.md b/.changeset/funny-drinks-scream.md index cb582701040..4428ac8ba31 100644 --- a/.changeset/funny-drinks-scream.md +++ b/.changeset/funny-drinks-scream.md @@ -2,4 +2,4 @@ "effect": patch --- -Refine existing type in Predicated.isTagged +Refine existing type in Predicate.isTagged