From 28b028e12ac4ca5587b246e2b786c3fd33085c6a Mon Sep 17 00:00:00 2001 From: Caleb Eby Date: Wed, 25 Jun 2025 17:58:13 -0700 Subject: [PATCH 1/4] Narrow types for Show utility --- packages/preact/utils/src/index.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/preact/utils/src/index.ts b/packages/preact/utils/src/index.ts index 98478882d..a67ed74e9 100644 --- a/packages/preact/utils/src/index.ts +++ b/packages/preact/utils/src/index.ts @@ -3,10 +3,12 @@ import { useSignal } from "@preact/signals"; import { Fragment, createElement, JSX } from "preact"; import { useMemo } from "preact/hooks"; +type Falsy = false | 0 | "" | null | undefined; + interface ShowProps { when: Signal | ReadonlySignal; fallback?: JSX.Element; - children: JSX.Element | ((value: T) => JSX.Element); + children: JSX.Element | ((value: Exclude) => JSX.Element); } export function Show(props: ShowProps): JSX.Element | null { From 2f1751b7465f7fe6de9466024d6653d0d8c74b50 Mon Sep 17 00:00:00 2001 From: Caleb Eby Date: Wed, 25 Jun 2025 18:07:42 -0700 Subject: [PATCH 2/4] TIL that 0n is also falsy I don't know if I like that. 0n feels more object-y than 0 to me --- packages/preact/utils/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/preact/utils/src/index.ts b/packages/preact/utils/src/index.ts index a67ed74e9..bb84419dc 100644 --- a/packages/preact/utils/src/index.ts +++ b/packages/preact/utils/src/index.ts @@ -3,7 +3,7 @@ import { useSignal } from "@preact/signals"; import { Fragment, createElement, JSX } from "preact"; import { useMemo } from "preact/hooks"; -type Falsy = false | 0 | "" | null | undefined; +type Falsy = false | 0 | 0n | "" | null | undefined; interface ShowProps { when: Signal | ReadonlySignal; From 229fbbe0f79f7aff77f5185857f24e36f1e4d194 Mon Sep 17 00:00:00 2001 From: Caleb Eby Date: Wed, 25 Jun 2025 18:18:26 -0700 Subject: [PATCH 3/4] Use NonNullable. That's what TS type narrowing does by default. Downside: It won't correctly handle literal values like "hello" vs "", but oh well. --- packages/preact/utils/src/index.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/preact/utils/src/index.ts b/packages/preact/utils/src/index.ts index bb84419dc..785d447b9 100644 --- a/packages/preact/utils/src/index.ts +++ b/packages/preact/utils/src/index.ts @@ -3,12 +3,10 @@ import { useSignal } from "@preact/signals"; import { Fragment, createElement, JSX } from "preact"; import { useMemo } from "preact/hooks"; -type Falsy = false | 0 | 0n | "" | null | undefined; - interface ShowProps { when: Signal | ReadonlySignal; fallback?: JSX.Element; - children: JSX.Element | ((value: Exclude) => JSX.Element); + children: JSX.Element | ((value: NonNullable) => JSX.Element); } export function Show(props: ShowProps): JSX.Element | null { From a1e13bf2801ef39e631abd3e048e160a01ed54e5 Mon Sep 17 00:00:00 2001 From: Jovi De Croock Date: Fri, 27 Jun 2025 08:47:32 +0200 Subject: [PATCH 4/4] Add changeset --- .changeset/plenty-bikes-fold.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/plenty-bikes-fold.md diff --git a/.changeset/plenty-bikes-fold.md b/.changeset/plenty-bikes-fold.md new file mode 100644 index 000000000..80a997036 --- /dev/null +++ b/.changeset/plenty-bikes-fold.md @@ -0,0 +1,5 @@ +--- +"@preact/signals": patch +--- + +Narrow types for Show utility, the callback is truthy by design