From 725edda47c4943bf7f00f9b4c459357b5296b33d Mon Sep 17 00:00:00 2001 From: nikelborm Date: Sat, 9 Aug 2025 14:10:04 +0300 Subject: [PATCH] fix(effect): Made Schema.brand not override piped schemas to any, when extracted to a constant --- .changeset/flat-buttons-design.md | 21 +++++++++++++++++++++ packages/effect/dtslint/Schema/Brand.tst.ts | 13 +++++++++++++ packages/effect/src/Schema.ts | 2 +- 3 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 .changeset/flat-buttons-design.md diff --git a/.changeset/flat-buttons-design.md b/.changeset/flat-buttons-design.md new file mode 100644 index 00000000000..8dbd0ea82bc --- /dev/null +++ b/.changeset/flat-buttons-design.md @@ -0,0 +1,21 @@ +--- +"effect": patch +--- + +Made Schema.brand keep type of schema being piped into it even if brand schema was extracted into a variable. Type was previously Schema.any + +Before: + +```ts +const UserIdBrandSchema = Schema.brand("UserId") +const UserIdSchema = pipe(Schema.Number, UserIdBrandSchema) +// ^? Schema.brand +``` + +After: + +```ts +const UserIdBrandSchema = Schema.brand("UserId") +const UserIdSchema = pipe(Schema.Number, UserIdBrandSchema) +// ^? Schema.brand +``` diff --git a/packages/effect/dtslint/Schema/Brand.tst.ts b/packages/effect/dtslint/Schema/Brand.tst.ts index 67d630d8c82..f402e500dfd 100644 --- a/packages/effect/dtslint/Schema/Brand.tst.ts +++ b/packages/effect/dtslint/Schema/Brand.tst.ts @@ -25,4 +25,17 @@ describe("SchemaBrand", () => { }) ) }) + + it("should not override types with any when extracted into a constant", () => { + const UserIdBrandSchema = Schema.brand("UserId") + + const UserIdSchema = pipe(Schema.Number, UserIdBrandSchema) + + type IUserId = Schema.Schema.Type + + type IsAny = 0 extends 1 & T ? true : false + + expect>().type.toBe() + expect().type.toBeAssignableTo() + }) }) diff --git a/packages/effect/src/Schema.ts b/packages/effect/src/Schema.ts index b259c7dd364..34c5f724b42 100644 --- a/packages/effect/src/Schema.ts +++ b/packages/effect/src/Schema.ts @@ -3196,7 +3196,7 @@ export const brand = ( brand: B, annotations?: Annotations.Schema & Brand> ) => -(self: S): brand => { +(self: SubS): brand => { const annotation: AST.BrandAnnotation = option_.match(AST.getBrandAnnotation(self.ast), { onNone: () => [brand], onSome: (brands) => [...brands, brand]