From e11bbff2348cb77c1210573781e5f8a6a3bb7d9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 22 Jul 2025 01:57:41 +0200 Subject: [PATCH] Component as class --- packages/effect-fc/src/Component.ts | 6 ++---- packages/example/src/routes/dev/memo.tsx | 8 ++++---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/packages/effect-fc/src/Component.ts b/packages/effect-fc/src/Component.ts index 5168910..0ae4a90 100644 --- a/packages/effect-fc/src/Component.ts +++ b/packages/effect-fc/src/Component.ts @@ -5,6 +5,8 @@ import type { ExcludeKeys } from "./utils.js" export interface Component extends Pipeable.Pipeable { + new(_: never): {} + readonly body: (props: P) => Effect.Effect readonly displayName?: string readonly options: Component.Options @@ -21,10 +23,6 @@ export namespace Component { } } -export interface ComponentClass extends Component { - -} - const ComponentProto = Object.seal({ pipe() { return Pipeable.pipeArguments(this, arguments) } diff --git a/packages/example/src/routes/dev/memo.tsx b/packages/example/src/routes/dev/memo.tsx index b457d3d..08208ca 100644 --- a/packages/example/src/routes/dev/memo.tsx +++ b/packages/example/src/routes/dev/memo.tsx @@ -28,16 +28,16 @@ const RouteComponent = Component.make(function* RouteComponent() { Component.withRuntime(runtime.context) ) -const SubComponent = Component.make(function* SubComponent(props: { readonly value?: string }) { +class SubComponent extends Component.make(function* SubComponent(props: { readonly value?: string }) { const id = yield* makeUuid4.pipe(Effect.provide(GetRandomValues.CryptoRandom)) return {id} -}) +}) {} -const MemoizedSubComponent = SubComponent.pipe( +class MemoizedSubComponent extends SubComponent.pipe( Component.memo, Component.suspense, Component.memo, -) +) {} type T = typeof MemoizedSubComponent extends Component.Memoized ? P : never export const Route = createFileRoute("/dev/memo")({