diff --git a/.changeset/large-geese-kick.md b/.changeset/large-geese-kick.md new file mode 100644 index 000000000..310dbf4a8 --- /dev/null +++ b/.changeset/large-geese-kick.md @@ -0,0 +1,5 @@ +--- +'@astrojs/compiler': patch +--- + +[TSX] Add `ASTRO__MergeUnion` util to allow destructuring from automatically inferred union Prop types diff --git a/internal/printer/print-to-tsx.go b/internal/printer/print-to-tsx.go index 5d5001dc9..ea1b6c8d4 100644 --- a/internal/printer/print-to-tsx.go +++ b/internal/printer/print-to-tsx.go @@ -141,7 +141,7 @@ func renderTsx(p *printer, n *Node) { if hasGetStaticPaths { paramsIdent = "ASTRO__Get" if propsIdent == "Record" { - propsIdent = "ASTRO__Get" + propsIdent = "ASTRO__MergeUnion>" } } @@ -150,6 +150,7 @@ func renderTsx(p *printer, n *Node) { p.printf(`type ASTRO__ArrayElement = ArrayType extends readonly (infer ElementType)[] ? ElementType : never; type ASTRO__Flattened = T extends Array ? ASTRO__Flattened : T; type ASTRO__InferredGetStaticPath = ASTRO__Flattened>>>; +type ASTRO__MergeUnion = T extends unknown ? T & { [P in Exclude]?: never } extends infer O ? { [P in keyof O]: O[P] } : never : never; type ASTRO__Get = T extends undefined ? undefined : K extends keyof T ? T[K] : never;%s`, "\n") } diff --git a/packages/compiler/test/tsx/props-and-getStaticPaths.ts b/packages/compiler/test/tsx/props-and-getStaticPaths.ts index 34ca32715..fd28c0c55 100644 --- a/packages/compiler/test/tsx/props-and-getStaticPaths.ts +++ b/packages/compiler/test/tsx/props-and-getStaticPaths.ts @@ -3,7 +3,7 @@ import { test } from 'uvu'; import * as assert from 'uvu/assert'; function getPrefix({ - props = `ASTRO__Get`, + props = `ASTRO__MergeUnion>`, component = '__AstroComponent_', params = `ASTRO__Get`, }: { @@ -23,6 +23,7 @@ function getSuffix() { return `type ASTRO__ArrayElement = ArrayType extends readonly (infer ElementType)[] ? ElementType : never; type ASTRO__Flattened = T extends Array ? ASTRO__Flattened : T; type ASTRO__InferredGetStaticPath = ASTRO__Flattened>>>; +type ASTRO__MergeUnion = T extends unknown ? T & { [P in Exclude]?: never } extends infer O ? { [P in keyof O]: O[P] } : never : never; type ASTRO__Get = T extends undefined ? undefined : K extends keyof T ? T[K] : never;`; } @@ -69,7 +70,7 @@ export function getStaticPaths() { "";
-export default function __AstroComponent_(_props: ASTRO__Get): any {} +export default function __AstroComponent_(_props: ASTRO__MergeUnion>): any {} ${getSuffix()} ${getPrefix()}`; const { code } = await convertToTSX(input, { sourcemap: 'external' });