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 :

  1. 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 ?
  2. 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.