BUG: find, findAll, findAllSelf

According to the API

  interface Element extends Node {
    find(selector: string): Element | null;
    findAll(selector: string): HTMLElement[];
    findAllSelf(selector: string): HTMLElement[];
  }
  interface HTMLElement extends Element {
    find(selector: string): HTMLElement;
    findAll(selector: string): HTMLElement[];
    findAllSelf(selector: string): HTMLElement[];
  }
  interface DocumentFragment extends Node, NonElementParentNode, ParentNode {
    find(selector: string): HTMLElement;
    findAll(selector: string): HTMLElement[];
  }

Actually only Element.find() return type is correct, all others are not.

  1. find() might be unsuccessful and return null
  2. All three functions can find Element that is not HTMLElement, e.g. <svg>

Therefore the corrected types have to be

  interface Element extends Node {
    find(selector: string): Element | null;
    findAll(selector: string): Element[];
    findAllSelf(selector: string): Element[];
  }
  interface HTMLElement extends Element {
    find(selector: string): Element | null;
    findAll(selector: string): Element[];
    findAllSelf(selector: string): Element[];
  }
  interface DocumentFragment extends Node, NonElementParentNode, ParentNode {
    find(selector: string): Element | null;
    findAll(selector: string): Element[];
  }

Even more as HTMLElement extends Element, we don’t need to redefine exactly the same signature from Element

  interface Element extends Node {
    find(selector: string): Element | null;
    findAll(selector: string): Element[];
    findAllSelf(selector: string): Element[];
  }
  interface DocumentFragment extends Node, NonElementParentNode, ParentNode {
    find(selector: string): Element | null;
    findAll(selector: string): Element[];
  }