refactor: align getElement/getElements generic signature with ref builders#8
Merged
Merged
Conversation
Switch from `E extends keyof HTMLElementTagNameMap` to separate overloads: tag name for auto-inference, `E extends Element` for explicit typing, and a plain fallback — matching the ref builder API.
size-limit report 📦
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Overview
Reworks the generic type parameters of
ctx.getElementandctx.getElementsto match the overload pattern already used by theone/manyref builders.Problem Statement
The previous signature used a single generic
E extends keyof HTMLElementTagNameMap, which forced the return type throughHTMLElementTagNameMap. This made it impossible to type the result as a custom element type (e.g.SVGCircleElementor a customHTMLElementsubtype) when querying by CSS selector, and created an inconsistency with the ref builder API that already supported this viaone<CustomEl>(".selector").Solution Approach
E extends keyof HTMLElementTagNameMapgeneric with three overload tiers for bothgetElementandgetElements(including their scoped-root variants):HTMLElementTagNameMap(e.g.getElement("button")→HTMLButtonElement)<E extends Element>explicit generic → returnsE(e.g.getElement<SVGCircleElement>(".circle"))Elementbind(), now requiring an explicit<HTMLElement>generic since those tags are not inHTMLElementTagNameMapBreaking Changes
CSS selector queries that previously returned
HTMLElementTagNameMap[E](always anHTMLElementsubtype) now returnElementwhen no tag name or explicit generic is provided. Code passing the result directly to APIs expectingHTMLElement(such asctx.bind()) will need an explicit generic:ctx.getElement<HTMLElement>(".selector").Testing
Type-level coverage added: a new test case verifies that
getElement<CustomEl>andgetElements<CustomEl>(both plain and scoped-root variants) correctly resolve toCustomElandCustomEl[]respectively.