Microsoft/TypeScript

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

Open

#27.173 aperta il 18 set 2018

Vedi su GitHub
 (0 commenti) (0 reazioni) (0 assegnatari)TypeScript (6726 fork)batch import
DocsHelp Wanted

Metriche repository

Star
 (48.455 star)
Metriche merge PR
 (Merge medio 6g 17h) (9 PR mergiate in 30 g)

Descrizione

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.

Guida contributor