From 68fe96bef5d5d92577b547f8f703a26d23e9aa57 Mon Sep 17 00:00:00 2001 From: Michael Arnaldi Date: Fri, 15 Nov 2024 11:37:43 +0100 Subject: [PATCH] Allow data classes to be branded with an additional type parameter --- .changeset/witty-balloons-shout.md | 26 ++++++++++++++++++++++++++ packages/effect/src/Data.ts | 12 ++++++++---- 2 files changed, 34 insertions(+), 4 deletions(-) create mode 100644 .changeset/witty-balloons-shout.md diff --git a/.changeset/witty-balloons-shout.md b/.changeset/witty-balloons-shout.md new file mode 100644 index 00000000000..df6d5fcb910 --- /dev/null +++ b/.changeset/witty-balloons-shout.md @@ -0,0 +1,26 @@ +--- +"effect": minor +--- + +Allow data classes to be branded with an additional type parameter + +```ts +import { Data, HashMap } from "effect" + +export class T extends Data.Class< + { id: string }, + { readonly _brand: unique symbol } +> {} + +// type error +export const hashMap1: HashMap.HashMap = HashMap.empty().pipe( + HashMap.set({ id: "one" }, "one"), + HashMap.set({ id: "one" }, "two") +) + +// no type error +export const hashMap2: HashMap.HashMap = HashMap.empty().pipe( + HashMap.set(new T({ id: "one" }), "one"), + HashMap.set(new T({ id: "one" }), "two") +) +``` diff --git a/packages/effect/src/Data.ts b/packages/effect/src/Data.ts index 6b02cc2df75..83968bc18d1 100644 --- a/packages/effect/src/Data.ts +++ b/packages/effect/src/Data.ts @@ -183,10 +183,14 @@ export const tagged = ( * @since 2.0.0 * @category constructors */ -export const Class: new = {}>( - args: Types.Equals extends true ? void - : { readonly [P in keyof A]: A[P] } -) => Readonly = internal.Structural as any +export const Class: { + new = {}>( + args: Types.Equals extends true ? void : { readonly [P in keyof A]: A[P] } + ): Readonly + new = {}, Brand = {}>( + args: Types.Equals extends true ? void : { readonly [P in keyof A]: A[P] } + ): Readonly & Brand +} = internal.Structural as any /** * Provides a Tagged constructor for a Case Class.