Skip to content

Add support for extracting the tag name in types #5

Closed
@wooorm

Description

@wooorm

Initial checklist

  • I read the support docs
  • I read the contributing guide
  • I agree to follow the code of conduct
  • I searched issues and couldn’t find anything (or linked relevant results below)

Subject

Add support for extracting the tag name in types

Problem

h('a') // Element

Solution

h('a') // Element & {tagName: 'a'}

Something along these lines:

type DefaultTagName = 'div'
type ExtractTagName<T extends string> =
  T extends `${infer TagName}#${infer _}`
  ? (TagName extends '' ? DefaultTagName : ExtractTagName<TagName>)
  : T extends `${infer TagName}.${infer _}`
  ? (TagName extends '' ? DefaultTagName : TagName)
  : (T extends '' ? DefaultTagName : T); // No match

type A = ExtractTagName<'a'>;
type B = ExtractTagName<'#id'>;
type C = ExtractTagName<'.class'>;
type D = ExtractTagName<'a.red.blue'>;
type E = ExtractTagName<'a.class#id'>;
type F = ExtractTagName<'a#id.class'>;
type G = ExtractTagName<'a#'>;
type H = ExtractTagName<'.'>;

https://www.typescriptlang.org/play?ts=4.1.0-pr-40336-88#code/C4TwDgpgBAogHsATgQwMbACrIOYDlkC2EAPBlBAhAHYAmAzlHUgJZXYB8UAvAFBRRkKwavSgADACQBvVgDMIiATnxEAvgGJpchVAD6qsXygB+KAAoseQtCEiGAcnsmo9mswBuTgFywEKdJYqJIHW7ACURj6ClLQMkjJU8oohagB0Wok6+ob8phbK1uQxoo7Orh7eSlZEEfw+FkXCsS5OpuWeUFFhANxQAPR9ULgA9lAEyMCoABY8PKCQUACC3L5IaJgFRMT2dGDIVPbs3XPg0ABCK-BrAZsk9urMNIfH89AACpd+6yl3qagANsg6HRnicFgBhT7XDbVO4AI1SiAgNFScP+AFcIKDXlAAGJQ-wwoLbIEogFAugPJ5HWazIA

Alternatives

n/a

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions