Comment puis-je prolonger un Tapuscrit définition de la classe dans un autre fichier de définition?
J'ai une bibliothèque JS appelé dépliant qui possède déjà un fichier d'enregistrement de fichier de définition.
Je souhaite utiliser un plugin qui s'étend de certains objets de dépliant avec une fonction supplémentaire.
Dans le fichier d'enregistrement du fichier de définition des objets sont définies comme des classes plutôt que des interfaces.
par exemple
declare module L {
function circleMarker(latlng: LatLng, options?: PathOptions): CircleMarker;
export class CircleMarker extends Circle {
constructor(latlng: LatLng, options?: PathOptions);
setLatLng(latlng: LatLng): CircleMarker;
setRadius(radius: number): CircleMarker;
toGeoJSON(): any;
}
}
Si j'essaie de le définir une deuxième fois dans un fichier distinct, puis j'obtiens une erreur à propos de "Dupliquer l'Identificateur 'CircleMarker'.".
declare module L {
export class CircleMarker {
bindLabel(name: string, options: any): CircleMarker;
}
}
Ce sens que c'est une classe, et non pas une interface, mais ce qui est le cas est-il un moyen d'étendre la définition de cette classe sans changer la définition d'origine du fichier?
Le fichier de définition de base est tirée à partir de DefinitelyTyped via nuget j'ai donc un très fort désir de ne pas apporter de modifications qu'il va faire la mise à jour beaucoup plus maladroit/sujettes à l'échec.
- Pour l'instant, je suis simplement en contournant le type de vérification qui est ennuyeux, mais réalisable. (<aucun>marqueur).bindLabel("Bonjour le Monde", { });
- Vous êtes essentiellement en essayant de faire des "partiels" de travail (comme en C# par exemple), ce qui n'est pas une caractéristique de la Machine. Ce n'est pas simple dans un langage de script où tout n'est pas emballé joliment comme dans une .NET de l'assemblée.
- WiredPrairie: Le C# équivalent serait partielle d'interfaces que c'est sur les définitions de types plutôt que des implémentations réelles. Tapuscrit soutient d'ores et déjà ce qui concerne les interfaces blogs.msdn.com/b/typescript/archive/2013/01/24/... "interfaces en caractères d'imprimerie sont ouverts, ce qui signifie que vous pouvez ajouter vos propres membres à une interface en écrivant un autre bloc d'interface." mais elle ne dispose actuellement pas de classes. Je suppose que c'est pour l'ergonomie/design raisons plutôt que .Net métadonnées être mieux.
- Je comprends C# partiels-et le manque de réelle Tapuscrit partiels. Cependant, la
CircleMarker
classe n'est pas uninterface
, donc je ne vois pas en quoi c'est pertinent. Le défi est que les interfaces sont juste le temps de compilation des contrôles à la Machine, il est donc possible de "sortir" de leur. Cependant, les cours sont un véritable JavaScript construire, et beaucoup plus complexe à étendre proprement et de manière cohérente. - Elle est pertinente, parce que je suis en création d'une définition de code JS existant, de ne pas mettre mon propre. Idéalement, la personne qui en fait la définition d'origine du fichier doit avoir utilisé des interfaces, mais ils n'ont pas, et je suis maintenant coincé à essayer de contourner leurs choix de conception. Il y a divers billets à propos de faire des classes ouvertes comme les interfaces sont, typescript.codeplex.com/workitem/917.
- Le résumé est que vous ne pouvez pas faire ce que vous voulez. Ce n'est pas une caractéristique de la Machine. Il n'y a pas d'élégantes solutions de rechange. Le meilleur choix est de fixer la définition (bien que je ne suis pas sûr que de le faire pour la raison que vous voulez, c'est forcément une bonne raison.) Vous êtes à la modification de la nature de la classe.
- Je pense qu'il serait mieux rédigé comme je suis l'évolution de la nature de la définition de refléter la réalité du Javascript, j'ai chargé, mais c'est juste des arguties! Auriez-vous l'esprit de soumettre une réponse indiquant ce que vous avez dit ici, que c'est pas possible. Je serai heureux de l'accepter et de vous donner le crédit que vous méritez. Je vais probablement juste coller avec mon <aucun> cast hack pour l'instant, c'est moins sûr, mais ne seront pas remplacées par la prochaine nuget mise à jour, comme la modification de la définition.
Vous devez vous connecter pour publier un commentaire.
Si vous ne contrôlez pas à la définition d'origine du fichier, et ne peut pas faire des ajustements à elle, puis, malheureusement, ce que vous essayez de réaliser n'est pas pris en charge actuellement en caractères d'imprimerie. Un
interface
dans le Tapuscrit est la seule construction qui permet une prolongation raisonnable, car c'est uniquement au moment de la compilation/vérification de la syntaxe et non pas au moment de l'exécution de l'opération.Vous ne pouvez pas étendre un
class
à la Machine avec de nouvelles fonctionnalités à l'aide de seulement Tapuscrit (et d'attendre l'achèvement de code/Intellisense à fonctionner comme prévu). Vous pouvez bien sûr ajouter des fonctions auprototype
pour laCircleMarker
classe, mais ils seraient indisponibles pour Intellisense et ne permettrait pas à la compilation, sauf si vous utilisez un type d'affirmation.Au lieu d'utiliser
any
, vous devriez être en mesure d'utiliser uninterface
avec l'assertion de type:Alors:
Heureusement, il n'ajoute pas n'importe quelle course-une surcharge de temps, juste un peu de saisie de texte supplémentaire (pun intended!).
Il y a eu des suggestions pour des choses comme "mix-ins" sur CodePlex, mais ils n'ont pas été mises en œuvre. Même le mélange dans les suggestions de ne pas être tout à fait simple à utiliser, et ne fonctionne pas bien pour les bibliothèques qui n'ont pas été entièrement écrit en caractères d'imprimerie (comme il serait trop facile d'avoir un code JavaScript qui ne pouvaient tout simplement pas être en toute sécurité construit par exemple avec un mix-in).
class
, et il serait bien de le fixer par une augmentation de la définition.Vous ne pouvez pas le faire avec le
class
mot-clé. Il y a une demande de fonctionnalité, vous pouvez voter ici : https://typescript.codeplex.com/workitem/917Vous pouvez toutefois imiter les classes à l'aide de
interfaces
comme indiqué dans la solution de contournement (https://typescript.codeplex.com/workitem/917) pour la question. Dans votre caset de l'étendre
C'est ce que j'ai essayé et cela se sent relativement à l'aise pour moi
où
CircleMarkerEx
etex
peut être définie commepuis
mais il est encore un peu étrange
Est-ce possible?
Et ensuite définir votre CircleMarker instances MyCircleMarker