Automatically infer the return type of Dom/Traverse#child(ren)?ByTag
authorTim Düsterhus <duesterhus@woltlab.com>
Mon, 4 Jan 2021 16:12:33 +0000 (17:12 +0100)
committerTim Düsterhus <duesterhus@woltlab.com>
Mon, 4 Jan 2021 16:16:31 +0000 (17:16 +0100)
wcfsetup/install/files/js/WoltLabSuite/Core/Dom/Traverse.js
wcfsetup/install/files/ts/WoltLabSuite/Core/Dom/Traverse.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Ui/FlexibleMenu.ts
wcfsetup/install/files/ts/WoltLabSuite/Core/Ui/TabMenu/Simple.ts

index 0bafff9d39371150e94dd80a2305db00d50a8bdb..069ed6f8d83c40dc8833db59337da797b28cb1f2 100644 (file)
@@ -70,9 +70,6 @@ define(["require", "exports"], function (require, exports) {
         return _getChildren(element, 2 /* ClassName */, className)[0] || null;
     }
     exports.childByClass = childByClass;
-    /**
-     * Examines child elements and returns the first child which equals the given tag.
-     */
     function childByTag(element, tagName) {
         return _getChildren(element, 3 /* TagName */, tagName)[0] || null;
     }
@@ -91,9 +88,6 @@ define(["require", "exports"], function (require, exports) {
         return _getChildren(element, 2 /* ClassName */, className);
     }
     exports.childrenByClass = childrenByClass;
-    /**
-     * Examines child elements and returns all children which equal the given tag.
-     */
     function childrenByTag(element, tagName) {
         return _getChildren(element, 3 /* TagName */, tagName);
     }
index a44e689f872f023e03f814426e0d0e16f1002a80..8404075449308a50230e3fb469baf56e9f7aeb06 100644 (file)
@@ -89,6 +89,11 @@ export function childByClass(element: Element, className: string): Element | nul
 /**
  * Examines child elements and returns the first child which equals the given tag.
  */
+export function childByTag<K extends Uppercase<keyof HTMLElementTagNameMap>>(
+  element: Element,
+  tagName: K,
+): HTMLElementTagNameMap[Lowercase<K>] | null;
+export function childByTag(element: Element, tagName: string): Element | null;
 export function childByTag(element: Element, tagName: string): Element | null {
   return _getChildren(element, Type.TagName, tagName)[0] || null;
 }
@@ -110,6 +115,11 @@ export function childrenByClass(element: Element, className: string): Element[]
 /**
  * Examines child elements and returns all children which equal the given tag.
  */
+export function childrenByTag<K extends Uppercase<keyof HTMLElementTagNameMap>>(
+  element: Element,
+  tagName: K,
+): HTMLElementTagNameMap[Lowercase<K>][];
+export function childrenByTag(element: Element, tagName: string): Element[];
 export function childrenByTag(element: Element, tagName: string): Element[] {
   return _getChildren(element, Type.TagName, tagName);
 }
index ef142804632ee4f7cee5c3478ed114a952ab78d3..134ba444672aa0a33215d471e74052cc8d8edb8e 100644 (file)
@@ -48,7 +48,7 @@ export function register(containerId: string): void {
     return;
   }
 
-  const list = DomTraverse.childByTag(container, "UL") as HTMLUListElement;
+  const list = DomTraverse.childByTag(container, "UL");
   if (list === null) {
     throw "Expected an <ul> element as child of container '" + containerId + "'.";
   }
@@ -99,7 +99,7 @@ export function rebuild(containerId: string): void {
   availableWidth -= DomUtil.styleAsInt(styles, "margin-right");
 
   const list = _itemLists.get(containerId)!;
-  const items = DomTraverse.childrenByTag(list, "LI") as HTMLLIElement[];
+  const items = DomTraverse.childrenByTag(list, "LI");
   let dropdown = _dropdowns.get(containerId);
   let dropdownWidth = 0;
   if (dropdown !== undefined) {
index e58de8ff390e963d9cc2838df5f962468626e65f..b2eb37eeb48936db22483a1b3dc2ba29d0e7b4ce 100644 (file)
@@ -43,7 +43,7 @@ class TabMenuSimple {
       return false;
     }
 
-    const nav = DomTraverse.childByTag(this.container, "NAV") as HTMLElement;
+    const nav = DomTraverse.childByTag(this.container, "NAV");
     if (nav === null) {
       return false;
     }
@@ -54,7 +54,7 @@ class TabMenuSimple {
       return false;
     }
 
-    DomTraverse.childrenByTag(this.container, "DIV").forEach((container: HTMLElement) => {
+    DomTraverse.childrenByTag(this.container, "DIV").forEach((container) => {
       let name = container.dataset.name;
       if (!name) {
         name = DomUtil.identify(container);