Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Replaces several DOM methods with weaker typings and closes microsoft/TypeScript#4689 #885

Merged
merged 8 commits into from
Dec 12, 2020
18 changes: 11 additions & 7 deletions baselines/dom.generated.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4761,11 +4761,11 @@ interface Document extends Node, DocumentAndElementEventHandlers, DocumentOrShad
* Returns a reference to the first object with the specified value of the ID attribute.
* @param elementId String that specifies the ID value.
*/
getElementById(elementId: string): HTMLElement | null;
getElementById<E extends Element = HTMLElement>(elementId: string): E | null;
jrandolf marked this conversation as resolved.
Show resolved Hide resolved
/**
* Returns a HTMLCollection of the elements in the object on which the method was invoked (a document or an element) that have all the classes given by classNames. The classNames argument is interpreted as a space-separated list of classes.
*/
getElementsByClassName(classNames: string): HTMLCollectionOf<Element>;
getElementsByClassName<E extends Element = HTMLElement>(classNames: string): HTMLCollectionOf<E>;
/**
* Gets a collection of objects based on the value of the NAME or ID attribute.
* @param elementName Gets a collection of objects based on the value of the NAME or ID attribute.
Expand Down Expand Up @@ -4961,7 +4961,7 @@ interface DocumentEvent {
/** A minimal document object that has no parent. It is used as a lightweight version of Document that stores a segment of a document structure comprised of nodes just like a standard document. The key difference is that because the document fragment isn't part of the active document tree structure, changes made to the fragment don't affect the document, cause reflow, or incur any performance impact that can occur when changes are made. */
interface DocumentFragment extends Node, NonElementParentNode, ParentNode {
readonly ownerDocument: Document;
getElementById(elementId: string): HTMLElement | null;
getElementById<E extends Element = HTMLElement>(elementId: string): E | null;
jrandolf marked this conversation as resolved.
Show resolved Hide resolved
}

declare var DocumentFragment: {
Expand Down Expand Up @@ -5147,7 +5147,7 @@ interface Element extends Node, Animatable, ChildNode, InnerHTML, NonDocumentTyp
/**
* Returns a HTMLCollection of the elements in the object on which the method was invoked (a document or an element) that have all the classes given by classNames. The classNames argument is interpreted as a space-separated list of classes.
*/
getElementsByClassName(classNames: string): HTMLCollectionOf<Element>;
getElementsByClassName<E extends Element = HTMLElement>(classNames: string): HTMLCollectionOf<E>;
jrandolf marked this conversation as resolved.
Show resolved Hide resolved
getElementsByTagName<K extends keyof HTMLElementTagNameMap>(qualifiedName: K): HTMLCollectionOf<HTMLElementTagNameMap[K]>;
getElementsByTagName<K extends keyof SVGElementTagNameMap>(qualifiedName: K): HTMLCollectionOf<SVGElementTagNameMap[K]>;
getElementsByTagName(qualifiedName: string): HTMLCollectionOf<Element>;
Expand Down Expand Up @@ -6615,6 +6615,7 @@ interface HTMLElement extends Element, DocumentAndElementEventHandlers, ElementC
readonly offsetParent: Element | null;
readonly offsetTop: number;
readonly offsetWidth: number;
readonly parentElement: HTMLElement | null;
jrandolf marked this conversation as resolved.
Show resolved Hide resolved
spellcheck: boolean;
title: string;
translate: boolean;
Expand Down Expand Up @@ -10807,7 +10808,7 @@ interface Node extends EventTarget {
/**
* Returns the parent element.
*/
readonly parentElement: HTMLElement | null;
readonly parentElement: Element | null;
jrandolf marked this conversation as resolved.
Show resolved Hide resolved
/**
* Returns the parent.
*/
Expand Down Expand Up @@ -11065,7 +11066,7 @@ interface NonElementParentNode {
/**
* Returns the first element within node's descendants whose ID is elementId.
*/
getElementById(elementId: string): Element | null;
getElementById<E extends Element = HTMLElement>(elementId: string): E | null;
}

interface NotificationEventMap {
Expand Down Expand Up @@ -13001,7 +13002,9 @@ interface SVGElement extends Element, DocumentAndElementEventHandlers, DocumentA
/** @deprecated */
readonly className: any;
readonly ownerSVGElement: SVGSVGElement | null;
readonly parentElement: SVGElement | null;
readonly viewportElement: SVGElement | null;
getElementsByClassName<E extends Element = SVGElement>(classNames: string): HTMLCollectionOf<E>;
addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
Expand Down Expand Up @@ -13589,6 +13592,7 @@ interface SVGForeignObjectElement extends SVGGraphicsElement {
readonly width: SVGAnimatedLength;
readonly x: SVGAnimatedLength;
readonly y: SVGAnimatedLength;
getElementsByClassName<E extends Element = HTMLElement>(classNames: string): HTMLCollectionOf<E>;
addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGForeignObjectElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGForeignObjectElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
Expand Down Expand Up @@ -14392,7 +14396,7 @@ interface SVGSVGElement extends SVGGraphicsElement, DocumentEvent, SVGFitToViewB
forceRedraw(): void;
getComputedStyle(elt: Element, pseudoElt?: string | null): CSSStyleDeclaration;
getCurrentTime(): number;
getElementById(elementId: string): Element;
getElementById<E extends Element = HTMLElement>(elementId: string): E | null;
jrandolf marked this conversation as resolved.
Show resolved Hide resolved
getEnclosureList(rect: SVGRect, referenceElement: SVGElement | null): NodeListOf<SVGCircleElement | SVGEllipseElement | SVGImageElement | SVGLineElement | SVGPathElement | SVGPolygonElement | SVGPolylineElement | SVGRectElement | SVGTextElement | SVGUseElement>;
getIntersectionList(rect: SVGRect, referenceElement: SVGElement | null): NodeListOf<SVGCircleElement | SVGEllipseElement | SVGImageElement | SVGLineElement | SVGPathElement | SVGPolygonElement | SVGPolylineElement | SVGRectElement | SVGTextElement | SVGUseElement>;
pauseAnimations(): void;
Expand Down
4 changes: 2 additions & 2 deletions inputfiles/addedTypes.json
Original file line number Diff line number Diff line change
Expand Up @@ -596,7 +596,7 @@
"getElementsByClassName": {
"name": "getElementsByClassName",
"override-signatures": [
"getElementsByClassName(classNames: string): HTMLCollectionOf<Element>"
"getElementsByClassName<E extends Element = HTMLElement>(classNames: string): HTMLCollectionOf<E>"
]
},
"closest": {
Expand Down Expand Up @@ -958,7 +958,7 @@
"name": "getElementById",
"exposed": "Window",
"override-signatures": [
"getElementById(elementId: string): HTMLElement | null"
"getElementById<E extends Element = HTMLElement>(elementId: string): E | null"
]
}
}
Expand Down
78 changes: 75 additions & 3 deletions inputfiles/overridingTypes.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,32 @@
{
"mixins": {
"mixin": {
"NonElementParentNode": {
"name": "NonElementParentNode",
"methods": {
"method": {
"getElementById": {
"name": "getElementById",
"override-signatures": [
"getElementById<E extends Element = HTMLElement>(elementId: string): E | null"
]
}
}
}
},
"GlobalFetch": {
"name": "GlobalFetch",
"methods": {
"method": {
"fetch": {
"name": "fetch",
"override-signatures": [
"fetch(input: RequestInfo, init?: RequestInit): Promise<Response>"
]
}
}
}
},
"Animatable": {
"name": "Animatable",
"methods": {
Expand Down Expand Up @@ -484,6 +510,18 @@
},
"override-index-signatures": []
},
"HTMLElement": {
"name": "HTMLElement",
"properties": {
"property": {
"parentElement": {
"name": "parentElement",
"read-only": 1,
"override-type": "HTMLElement | null"
}
}
}
},
"Document": {
"name": "Document",
"methods": {
Expand All @@ -509,7 +547,7 @@
"getElementById": {
"name": "getElementById",
"override-signatures": [
"getElementById(elementId: string): HTMLElement | null"
"getElementById<E extends Element = HTMLElement>(elementId: string): E | null"
]
},
"getElementsByTagNameNS": {
Expand All @@ -523,7 +561,7 @@
"getElementsByClassName": {
"name": "getElementsByClassName",
"override-signatures": [
"getElementsByClassName(classNames: string): HTMLCollectionOf<Element>"
"getElementsByClassName<E extends Element = HTMLElement>(classNames: string): HTMLCollectionOf<E>"
]
},
"getElementsByName": {
Expand Down Expand Up @@ -672,7 +710,7 @@
"override-type": "Node & ParentNode | null"
},
"parentElement": {
"override-type": "HTMLElement | null"
"override-type": "Element | null"
},
"childNodes": {
"override-type": "NodeListOf<ChildNode>"
Expand Down Expand Up @@ -883,6 +921,21 @@
"deprecated": 1,
"name": "className",
"type": "any"
},
"parentElement": {
"name": "parentElement",
"read-only": 1,
"override-type": "SVGElement | null"
}
}
},
"methods": {
"method": {
"getElementsByClassName": {
"name": "getElementsByClassName",
"override-signatures": [
"getElementsByClassName<E extends Element = SVGElement>(classNames: string): HTMLCollectionOf<E>"
]
}
}
}
Expand All @@ -891,6 +944,12 @@
"name": "SVGSVGElement",
"methods": {
"method": {
"getElementById": {
"name": "getElementById",
"override-signatures": [
"getElementById<E extends Element = HTMLElement>(elementId: string): E | null"
]
},
"getEnclosureList": {
"name": "getEnclosureList",
"override-signatures": [
Expand Down Expand Up @@ -922,6 +981,19 @@
}
}
},
"SVGForeignObjectElement": {
"name": "SVGForeignObjectElement",
"methods": {
"method": {
"getElementsByClassName": {
"name": "getElementsByClassName",
"override-signatures": [
"getElementsByClassName<E extends Element = HTMLElement>(classNames: string): HTMLCollectionOf<E>"
]
}
}
}
},
"FormData": {
"name": "FormData",
"methods": {
Expand Down