2

J'ai la fonction d'ordre supérieur pour contructeurs emballage suivant:Comment documenter javascript fonction d'ordre supérieur?

/** 
* Wrapper for calling constructor with given parameters 
* 
* @param {Class} Cls 
* @returns {function} Wrapper on constructor which creates an instance of given Class 
*/ 
function constructorWrapper(Cls) { 
    return (...args) => new Cls(...args); 
} 

Donc, si j'ai une classe MyClass, je peux faire ce qui suit:

exports.MyClass = MyClass; 
exports.myClass = constructorWrapper(MyClass); 

Maintenant, la classe peut être instanciée dans ce qui suit 2 façons après l'importation:

const instance1 = new MyClass(param1, param2); 
const instance2 = myClass(param1, param2); 

En vscode, instance1 aura le soutien IntelliSense, mais instance2 ne sera pas. Comment puis-je documenter la fonction/export afin que les objets créés en utilisant le wrapper soient reconnus comme des instances de la classe?

+1

Javascript parfois pas très bien documenté sur 'vscode', utilisez plutôt Typescript :( – Chris

Répondre

1

Vous pourriez faire IntelliSense disponible en forçant le type de myClass:

/** @type {function(T1, T2): MyClass} */ 
exports.myClass = constructorWrapper(MyClass); 

Si vous souhaitez annoter se constructorWrapper, cependant, ce n'est pas possible de VSCode 1.11.1 (avec tapuscrit 2.2) . Alors que JSDoc supports generics:

/** 
* Wrapper for calling constructor with given parameters 
* 
* @param {function(new:T, ...*)} Cls The class constructor. 
* @returns {function(...*): T} Wrapper of the class constructor 
* @template T 
*/ 
function constructorWrapper(Cls) { 
    return (...args) => new Cls(...args); 
} 

et le type inférée est en effet correct:

<code>function constructorWrapper<T>(Cls: new (...arg1: any[]) => T): (...arg0: any[]) => T</code>

D'une certaine façon les deux "T" est déconnectée, ce qui myClass = constructorWrapper(MyClass) à adopter la signature de type (...arg0: any[]) => T. Qu'est-ce que T? Eh bien, nous ne savons pas, le traiter comme any et pas IntelliSense alors.

<code>myClass: (...arg0: any[]) => T</code>

de IntelliSense basé JSDoc-de VSCode est basé sur tapuscrit et I think this is a bug in TypeScript's handling of @template que de 2,2.

Si vous n'êtes pas limité au développement ES6 uniquement, je vous recommande de le réécrire entièrement dans TypeScript. Ensuite, vous obtiendrez l'IntelliSense attendu, plus la sécurité de type et de nombreux autres avantages.

Notez que depuis TypeScript 2.2 does not support variadic generics yet les arguments ne peuvent pas être parfaitement transmis, donc l'entrée à la myClass ne peut pas être vérifiée par type. Cela signifie que vous devez toujours annoter manuellement le type de myClass pour obtenir des informations parfaites.

+0

Merci d'avoir pris le temps de répondre à cette question, mais annoter manuellement le type de' myClass' ne fonctionnait pas dans vscode. que c'est une fonctionnalité bug/manquant et il n'y a pas de meilleure solution.Je suis de toute façon la réponse –

+0

@SuhasK Ajoutant manuellement le '@ type' fonctionne sur VSCode 1.11.1 avec TypeScript 2.2.2. votre instruction 'import'? – kennytm

+0

En effet cela fonctionne si la définition de la classe est présente dans le même fichier où elle est exportée Si elle est importée puis exportée (comme c'est mon cas), intellisense ne fonctionne pas même avec le type manuel annotation https://ibb.co/m5qW0k –