Skip to content

Instantly share code, notes, and snippets.

@usualoma
Created February 20, 2022 07:15
Show Gist options
  • Save usualoma/23b56d286e440e9511ae6c92094063da to your computer and use it in GitHub Desktop.
Save usualoma/23b56d286e440e9511ae6c92094063da to your computer and use it in GitHub Desktop.
type MyElementTagNameLookup<T extends string> =
T extends keyof HTMLElementTagNameMap ? HTMLElementTagNameMap[T] :
T extends keyof SVGElementTagNameMap ? SVGElementTagNameMap[T] :
Element;
type MyElementTagNameMapWithSuffix<T extends string> =
T extends `${infer TagName}[${infer _Attr}`
? MyElementTagNameLookup<TagName>
: T extends `${infer TagName}.${infer _ClassName}`
? MyElementTagNameLookup<TagName>
: MyElementTagNameLookup<T>;
type MyElementTagNameMap<T extends string> =
T extends `${infer _Head} ${infer Tail}`
? MyElementTagNameMap<Tail>
: MyElementTagNameMapWithSuffix<T>;
declare global {
interface ParentNode {
querySelectorAll<T extends string>(
selectors: T
): NodeListOf<MyElementTagNameMap<T>>;
querySelector<T extends string>(
selectors: T
): MyElementTagNameMap<T> | null
}
}
document.querySelectorAll(`a[href^="#"]`).forEach((e) => { alert(e.href) });
document.querySelector(`input[name="nickname"]`)?.value;
export {};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment