diff --git a/.changeset/funny-drinks-scream.md b/.changeset/funny-drinks-scream.md new file mode 100644 index 00000000000..4428ac8ba31 --- /dev/null +++ b/.changeset/funny-drinks-scream.md @@ -0,0 +1,5 @@ +--- +"effect": patch +--- + +Refine existing type in Predicate.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", () => {