From ab25658d7b2ddd9472defb0f55acf5e999f0a818 Mon Sep 17 00:00:00 2001 From: Johan Persson Date: Wed, 11 Feb 2026 12:39:10 +0100 Subject: [PATCH] refactor(ui): remove never-typed ghost props from useDefinition ownProps MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace the ChildrenProps intersection approach with ResolveBgProps, which transforms the base type so that only the relevant children variant exists in the final type. Provider components get childrenWithBgProvider (with children Omit'd), non-providers pass through unchanged — no more optional never properties showing up in autocomplete. Signed-off-by: Johan Persson --- .changeset/grumpy-towns-stick.md | 5 +++++ packages/ui/src/hooks/useDefinition/types.ts | 22 +++++++++++++------- 2 files changed, 19 insertions(+), 8 deletions(-) create mode 100644 .changeset/grumpy-towns-stick.md diff --git a/.changeset/grumpy-towns-stick.md b/.changeset/grumpy-towns-stick.md new file mode 100644 index 0000000000..0056469213 --- /dev/null +++ b/.changeset/grumpy-towns-stick.md @@ -0,0 +1,5 @@ +--- +'@backstage/ui': patch +--- + +Cleaned up `useDefinition` `ownProps` types to remove never-typed ghost properties from autocomplete. diff --git a/packages/ui/src/hooks/useDefinition/types.ts b/packages/ui/src/hooks/useDefinition/types.ts index 91ebdb8ef5..45ce5e3dc8 100644 --- a/packages/ui/src/hooks/useDefinition/types.ts +++ b/packages/ui/src/hooks/useDefinition/types.ts @@ -81,10 +81,19 @@ type ResolvedOwnProps< [K in keyof PropDefs & keyof P]: ResolvePropType; }; -type ChildrenProps = - Bg extends 'provider' - ? { childrenWithBgProvider: ReactNode; children?: never } - : { children: ReactNode; childrenWithBgProvider?: never }; +type BaseOwnProps< + D extends ComponentConfig, + P extends Record, +> = { + classes: Record; +} & ResolvedOwnProps; + +type ResolveBgProps< + D extends ComponentConfig, + TBase, +> = D['bg'] extends 'provider' + ? Omit & { childrenWithBgProvider: ReactNode } + : TBase; type DataAttributeKeys = { [K in keyof PropDefs]: PropDefs[K] extends { dataAttribute: true } @@ -122,10 +131,7 @@ export interface UseDefinitionResult< D extends ComponentConfig, P extends Record, > { - ownProps: { - classes: Record; - } & ResolvedOwnProps & - ChildrenProps; + ownProps: ResolveBgProps>; // Rest props excludes both propDefs keys AND utility prop keys restProps: keyof Omit> extends never