4 ms·
You can, using `function $<S>(sel: S | `${S}${ ' '|'#'|'.'|'[' }${string}`): HTMLElementMap[T];` or export type inferSelectorElementName<sel extends select
by dimava 2y ago
You can, using `function $<S>(sel: S | `${S}${ ' '|'#'|'.'|'[' }${string}`): HTMLElementMap[T];` or
export type inferSelectorElementName<sel extends selector> =
| string extends sel ? HTMLElement
: sel extends `${infer A},${infer B}` ? inferSelectorElementName<A | B>
: sel extends `${infer A}${'.' | '[' | '#'}${infer _}` ? inferSelectorElementName<A>
: sel
export type inferElementFromSelector<sel extends selector> =
| string extends sel ? HTMLElement
: inferSelectorElementName<sel> extends infer S ?
S extends '' ? HTMLElement
: S extends keyof HTMLElementTagNameMap ? HTMLElementTagNameMap[S]
: never
: never
TS types may go quite deep
Check Arktype library [https://arktype.io/ https://arktype.io/], it's type definitions are basically a Typescript written in JSON
const user = type({
name: "string",
platform: "'android' | 'ios'",
"version?": "number | string"
})