Microsoft/TypeScript

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

Aperta

#27.173 aperta il 18 set 2018

 (0 commenti) (0 reazioni) (0 assegnatari)TypeScript (13.395 fork)batch import
DocsHelp Wanted

Metriche repository

Star
 (108.860 stelle)
Metriche merge PR
 (Metriche PR in attesa)

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