Étendre JavaScript natif de tableau
Est-il possible d'hériter d'une classe JS natif de la fonction?
Par exemple, j'ai un JS fonction comme ceci:
function Xarray()
{
Array.apply(this, arguments);
//some stuff for insert, add and remove notification
}
Xarray.prototype = new Array();
J'ai essayé de le convertir en texte tapé à la Machine, mais je n'ai pas réussi!!
export class Xarray implements Array {
}
Le compilateur me demande de définir tous les Array
les propriétés de l'interface. Je sais que si j'ai besoin de cette Xarray.prototype = new Array();
, j'ai d'étendre Array
en TS.
Comment étendre la JS natif objet en TS?
- Il y a déjà des questions similaires: - stackoverflow.com/questions/12802383/... - stackoverflow.com/questions/12701732/... - stackoverflow.com/questions/12830647/...
- Vous pouvez résoudre ce problème avec une seule ligne de code dans le ctor, voir ma réponse ci-dessous.
Object.setPrototypeOf(this, YourDerivedClass.prototype);
Vous devez vous connecter pour publier un commentaire.
Je ne pense pas qu'il y est un moyen d'accéder à des interfaces existantes de type Array,
Vous devez créer une fonction et d'en hériter avec son prototype. Tapuscrit aussi accepter ce qui est similaire à javascript.
Mise à JOUR: celui-ci est discuté et n'a fourni la meilleure solution pour cela à jqfaq.com.
De l'espoir, ce qui pourrait vous aider!!!
this.push.apply(this,items); return this;
pour qu'il fonctionne avec les éléments initiaux (commenew XArray(1,2,3)
)De départ à la Machine 1.6, vous pouvez étendre le type du Tableau, voir Ce qui est nouveau en caractères d'imprimerie
Voici un exemple:
Si vous êtes émettant à ES5 ou ci-dessous, puis utiliser le code suivant:
Lire plus sur pourquoi cela est nécessaire ici.
Oui, il est possible d'étendre un natif JS objet en TS, cependant il y a un problème de l'extension des types intégrés (ceux inclus dans lib.d.ts) de type Array. Lisez ce post pour une solution de contournement: http://typescript.codeplex.com/workitem/4
Donc la définition d'un type d'interface qui s'étend d'un autochtone de type d'objet à un stade ultérieur peut être fait de la manière suivante:
À l'aide d'un exemple concret, vous pouvez trier certains éléments sur un tableau qui définissent une fonction de tri dans une interface et, plus tard, la met en œuvre sur un objet.
Tandis que cette recherche, je suis tombé sur Ben Nadel est excellent post sur L'Extension De Tableaux JavaScript Tout En Gardant Native Support De La Notation De La Fonctionnalité. Après une certaine confusion sur la façon de réussir à le convertir en texte dactylographié, j'ai créé entièrement de travail de la classe de Collection qui peut être sous-classé.
Il peut faire tout ce Tableau, y compris l'indexation par des crochets,l'utilisation en boucle constructions (for, while, forEach), des cartes, etc.
Les principales mesures de mise en œuvre sont
implements Array
peuExemple d'utilisation:
Je l'ai fait disponible comme un résumé, complet avec des tests et un exemple de mise en œuvre d'une sous-classe, mais je vous présente le source complet ici:
Bien sûr, les bits sur
Identifiable
, lefind
etremove
méthodes ne sont pas nécessaires, mais je fournir pas moins à part entière, l'exemple est un peu plus utilisable que sur une bare-bones Collection sans les méthodes de son propre.Constructeurs qui retourne un objet implicitement par la valeur de la
this
pour les appelants desuper()
. Constructeur généré le code est à saisir lessuper()
des rendements et de la remplacer parthis
.Intégrés dans les classes d'utilisation ES6
new.target
de faire la correction, mais il n'y a aucun moyen pour ES5 code pour s'assurer que les nouveaux.la cible a une valeur d'appeler le constructeur.C'est pourquoi vos méthodes supplémentaires disparaître - votre objet a le tort de prototype.
Tout ce que vous devez faire est de fixer le prototype de la chaîne après l'appel de
super()
.Être conscient que cette malédiction humilierez vos enfants et les enfants de vos enfants jusqu'à la fin du code; que vous avez à faire la correction à chaque génération d'une chaîne d'héritage.
Dans votre cas, un bon pari serait l'utilisation de ce modèle:
Alors vous pouvez faire:
note cependant que:
Si vous avez déjà un travail
Xarray
mise en œuvre, je ne vois pas l'intérêt de le recréer en caractères d'imprimerie, qui finira par la compilation de retour à JavaScript.Mais je vois le point d'être en mesure d'utiliser le
Xarray
en caractères d'imprimerie.Pour ce faire, vous avez simplement besoin d'une interface pour votre
Xarray
. Vous n'avez même pas besoin d'avoir une mise en œuvre concrète de votre interface depuis votre js mise en œuvre sera une.Après avoir fait cela, devrait être en mesure d'utiliser votre personnalisé de type défini par la variable déclarée sans réellement mettre en œuvre en caractères d'imprimerie.
Vous pouvez regarder pour référence ici pour voir comment ils ont tapé le
ECMAScript Array API
:http://typescript.codeplex.com/SourceControl/changeset/view/2bee84410e02#bin/lib.d.ts
Oui, vous pouvez augmenter la Builtin types et de le faire d'une manière qui ne nécessite pas de tout l'attirail d'un XArray comme décrit dans les autres réponses, et est plus proche de la façon dont vous le faire en javascript.
Tapuscrit permet à un certain nombre de façons de le faire, mais pour le Builtin types comme le Tableau et le Numéro que vous devez utiliser une "fusion" et de déclarer l'espace de noms global afin d'augmenter les types, voir les docs
donc pour le Tableau, on peut ajouter une option objet de métadonnées et un premier membre
nous pouvons l'utiliser comme ceci:
Il en va de même pour le Numéro de dire que je veux ajouter un modulo fonction qui n'est pas limitée comme le reste %
et nous pouvons l'utiliser comme ceci:
Pour les Fonctions que nous voulons ajouter une API, c'est à dire qu'elle se comporte comme une fonction et un objet, nous pouvons utiliser les types d'hybrides (voir docs)
l'utiliser comme:-
Avec le but de surmonter le problème de l'extension de la maternelle à la classe Array, j'ai profité d'un décorateur.
JS:
BTW, Ce décorateur peut être plus générique (pour les autres classes natives) si l'utilisation d'un décorateur d'usine.
Ne sais pas comment mal vu, ce n'est que par exemple j'avais besoin de créer un tableau de BulletTypes pour que je puisse cycle à travers eux. Ce que j'ai fait est le suivant:
Évidemment vous pourrait pourrait aussi faire une interface générique, quelque chose comme
interface SuperArray<T> extends Array<T>
.