Typescript: Héritage de tableau dans le fichier de déclaration ES6 (lib.es6.d.ts)

Créé le 13 sept. 2016  ·  3Commentaires  ·  Source: microsoft/TypeScript

ES6 prend en charge l'héritage Array, mais cela n'est pas reflété dans le fichier de déclaration TypeScript (lib.es6.d.ts).

Les fonctions de tableau comme 'filter' et 'slice' renvoient un tableau de la sous-classe, donc ce qui suit devrait être compilé en TypeScript:

class MyArray extends Array {
    get size() { return this.length; }
}

var x = new MyArray(10).slice();
x.size;

Les fonctions «reverse», «concat», «slice», «splice», «filter» doivent retourner avec le type «this».
La fonction 'map' renvoie également une instance du sous-type, mais je ne sais pas comment cela pourrait être représenté dans TypeScript, car cela nécessiterait un paramètre générique dans le type de retour, quelque chose comme:
map<U>(callback: (value: T, index: number, array: this) => U): this<U>

Un autre problème concerne les constructeurs statiques de la classe Array, cela devrait également être compilé:

var x = MyArray.of(1,2,3);
var y = MyArray.from([1,2,3]);
x.size;
y.size;

Il y a aussi quelques complications supplémentaires ajoutées par le symbole @

class MyArray2 extends Array {
    static get [Symbol.species]() { return Array; }
}

Chrome et Node.js implémentent déjà les fonctionnalités d'héritage de tableau présentées ici.

lib.d.ts Suggestion help wanted

Commentaire le plus utile

les fonctions statiques peuvent être résolues en faisant de Array une classe. le problème est que nous devons avoir un moyen de décrire un constructeur appelable (https://github.com/Microsoft/TypeScript/issues/183), car Array peut également être appelé en tant que fonction. Malheureusement, cette proposition est bloquée dans TC39, mais nous pouvons en faire une version pour les déclarations ambiantes. Je pense que cela devrait être suivi séparément.

pour le reste, ajouter this à la place de T[] devrait être possible. Je crois que sort déjà.

Tous les 3 commentaires

Cela va être difficile, car TypeScript n'autorise pas actuellement le re-positionnement des génériques sur les this polymorphes. Voir # 6223 (dont ce problème pourrait être considéré comme une dupe).

Le problème devient si dans une sous-classe vous introduisez un slot générique différent, comment fonctionne this polymorphe? Par exemple, vous créez une sous-classe qui ne traite que des tableaux de tableaux, où le générique T été utilisé de cette manière T[][] . Mais le slot générique dans Array de this serait T[] , comment exprimez-vous cela d'une manière qui fonctionne toujours?

Il y a plus d'exemples dans le problème mentionné ci-dessus, ainsi que des endroits où ce polymorphe se décompose lorsqu'il est combiné avec des génériques.

Le problème avec 'map' est en effet le même que celui discuté dans "Polymorphic 'this' and Generics", mais toutes les autres méthodes problématiques Array pourraient fonctionner correctement en retournant simplement 'this'.

Et les méthodes Array. interface.

les fonctions statiques peuvent être résolues en faisant de Array une classe. le problème est que nous devons avoir un moyen de décrire un constructeur appelable (https://github.com/Microsoft/TypeScript/issues/183), car Array peut également être appelé en tant que fonction. Malheureusement, cette proposition est bloquée dans TC39, mais nous pouvons en faire une version pour les déclarations ambiantes. Je pense que cela devrait être suivi séparément.

pour le reste, ajouter this à la place de T[] devrait être possible. Je crois que sort déjà.

Cette page vous a été utile?
0 / 5 - 0 notes