typescript - « L'appel de la cible ne contient aucune signature » pour l'appel à super() sans fichier de typage
J'essaie de faire fonctionner Polymer 2.0 avec TypeScript et je rencontre des problèmes en créant un constructeur lorsque des bibliothèques - y compris Polymer 2 - n'exposent pas un fichier de types approprié. Dans le cas le plus simple :
class MyView1 extends Polymer.Element {
public static is = 'my-view1';
constructor() {
super(); // [ts] Call target does not contain any signature
}
}
Pour le faire compiler du tout sans le constructeur, j'ai fait un declare var Polymer: any; dans un fichier principal .d.ts.
Maintenant, j'ai deux questions :
- Comment (le cas échéant) puis-je faire en sorte que TypeScript ignore cela et suppose simplement qu'il y a un super constructeur qu'il peut appeler ?
- Comment (si jamais) puis-je déclarer un fichier de typages qui contient une signature pour la super classe ? Je n'ai pas encore été capable de trouver la bonne documentation pour cela (et les divers cas d'utilisation auxquels je me suis heurté jusqu'à présent).
Réponse #1
Vous pouvez simplement étendre votre déclaration pour inclure un constructeur dans la propriété Element :
declare var Polymer: {
Element: {
new ();
}
};
Pour votre deuxième question, vous pouvez simplement déplacer ceci dans un fichier *.d.ts. Consultez la documentation sur la création de fichiers de déclaration.
Réponse #2
Pourquoi
Habituellement, c'est parce qu'il y a une logique conditionnelle qui modifie ce que la superclasse peut être. Par exemple --
class A {
constructor() {
super(/* anything */);
}
}
class B {
constructor() {
super(/* anything */);
}
}
var X = { prod: A, qa: A, dev: B, mock: B }[ environment.type ]; // inline map
class C extends X {
constructor() {
super(/* anything */);
}
}
-- peut entraîner ce comportement si type n'est même pas déclaré sur environment, ou [potentiellement] si TypeScript pense particulièrement que X pourrait être autre chose qu'une classe qui accepte les arguments fournis par la sous-classe.
