Microsoft/TypeScript

NodeList is no more compatible with Array<Node>. Breaking change in 3.0

Open

#27.173 geöffnet am 18. Sept. 2018

Auf GitHub ansehen
 (0 Kommentare) (0 Reaktionen) (0 zugewiesene Personen)TypeScript (6.726 Forks)batch import
DocsHelp Wanted

Repository-Metriken

Stars
 (48.455 Stars)
PR-Merge-Metriken
 (Durchschn. Merge 6T 17h) (9 gemergte PRs in 30 T)

Beschreibung

TypeScript Version: Version 3.0.3

Code

I didn't find any mentioning to this breaking change.

This code used to compile in 2.9.2:

/**
 * Array based implementation of NodeList
 */
class JSArrayNodeList extends Array<Node> implements NodeList {
	constructor(items?: Array<Node>) {
		if (items) {
			super(...items);
		} else {
			super();
		}
	}

	public item(index: number): Node {
		return this[index];
	}

	public copy(): JSArrayNodeList {
		return new JSArrayNodeList(this);
	}
}

In 3.0 forEach method of NodeList and Array became incompatible. Due to this changeset: https://github.com/Microsoft/TypeScript/commit/7a7d04e126fb7c1c6074ef26657eddb0f32e4003

A solution was to add explicit forEach which delegates call to super:

/**
 * Array based implementation of NodeList
 */
class JSArrayNodeList extends Array<Node> implements NodeList {
	constructor(items?: Array<Node>) {
		if (items) {
			super(...items);
		} else {
			super();
		}
	}

	public forEach(
		callbackfn: ((value: Node, index: number, array: Node[]) => void) | ((value: Node, key: number, parent: NodeList) => void),
		thisArg?: any): void {

		// Just call Array.forEach
		Array.prototype.forEach.call(thisArg, this, callbackfn);
	}

	public item(index: number): Node {
		return this[index];
	}

	public copy(): JSArrayNodeList {
		return new JSArrayNodeList(this);
	}
}

Expected behavior:

Documentation in breaking change list.

Actual behavior:

No information about breaking change.

Contributor Guide