Skip to content

Commit

Permalink
fix(types): Omit data types from polymorphic attributes (#10593)
Browse files Browse the repository at this point in the history
* fix(types): Omit data types from polymorphic attributes

* chore: changeset
  • Loading branch information
Princesseuh authored Mar 28, 2024
1 parent 9b08fac commit 61e283e
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 3 deletions.
5 changes: 5 additions & 0 deletions .changeset/khaki-ties-carry.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"astro": patch
---

Fixes Polymorphic type helper causing TypeScript errors in certain cases after the previous update
11 changes: 8 additions & 3 deletions packages/astro/types.d.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
import './astro-jsx';
import type { AstroBuiltinAttributes } from './dist/@types/astro.js';
import type { Simplify } from './dist/type-utils.js';
import type { OmitIndexSignature, Simplify } from './dist/type-utils.js';

/** Any supported HTML or SVG element name, as defined by the HTML specification */
export type HTMLTag = keyof astroHTML.JSX.DefinedIntrinsicElements;

/** The built-in attributes for any known HTML or SVG element name */
export type HTMLAttributes<Tag extends HTMLTag> = Omit<
astroHTML.JSX.IntrinsicElements[Tag],
astroHTML.JSX.DefinedIntrinsicElements[Tag],
keyof Omit<AstroBuiltinAttributes, 'class:list'>
>;

Expand All @@ -18,7 +18,12 @@ export type CSSProperty = keyof astroHTML.JSX.KebabCSSDOMProperties;

type PolymorphicAttributes<P extends { as: HTMLTag }> = Omit<P, 'as'> & {
as?: P['as'];
} & HTMLAttributes<P['as']>;
} & Omit<
// This is the same as HTMLAttributes<P['as']>, except we're using OmitIndexSignature to remove the index signature,
// used for data attribute, because it seems like it get too complex for TypeScript with it, not sure why.
OmitIndexSignature<astroHTML.JSX.DefinedIntrinsicElements[P['as']]>,
keyof Omit<AstroBuiltinAttributes, 'class:list'>
>;

export type Polymorphic<P extends { as: HTMLTag }> = PolymorphicAttributes<
Omit<P, 'as'> & { as: NonNullable<P['as']> }
Expand Down

0 comments on commit 61e283e

Please sign in to comment.