2017-06-04 2 views
0

J'apprécie l'ergonomie du développeur de VSCode et de Typescript. Un léger accroc est survenu quand j'ai appliqué un plugin pour le package pouchdb:Est-ce que VSCode/Typescript peut faire une inférence de type sur des objets modifiés par un plugin?

import * as pouch from 'pouchdb-browser' 
pouch.plugin(require('pouchdb-authentication')); 

const remoteDB: PouchDB.Database<PouchDB.Core.Encodable> = new pouch(
    'https://user.cloudant.com/databaseName', 
    { skip_setup: true } // a param wanted by the plugin 
); 

// invoking a method added by the plugin: 
remoteDB.signup('username','password', (err, resp) => {console.log(err)}); 

Le code ci-dessus de travaux dans le navigateur, mais mon expérience de développement est entravée parce VSCode ne reconnaît pas la valeur ajoutée plugin- méthodes:

VSCode TS claiming 'signup' property doesn't exist

Est-ce ce genre d'inférence de type en dehors du périmètre de VSCode? DE NOTE: Il n'y a pas de paquet @types pour ce paquet sur NPM: https://www.npmjs.com/package/@types/pouchdb-authentication est un 404. Est-ce la pièce manquante?

Répondre

1

Pour autant que je sache de la documentation (https://pouchdb.com/api.html#plugins), la méthode plugin étend votre objet PouchDB.Database avec tout ce que vous lui passez.

En tant que tel en réalité, si vous utilisez pouch.plugin(require('pouchdb-authentication'));, votre base de données n'est plus de type PouchDB.Database<T>; c'est en fait une extension de cette interface. Donc, le fait que VSCode se plaint est correct, car le type que vous avez déclaré remoteDB n'a pas de méthode signup. Ce que vous pouvez faire alors est de créer votre propre interface pour remoteDB qui étend PouchDB.Database<T> avec n'importe quelles méthodes et propriétés pouchdb-authentication ajoute; par exemple.

interface PouchDBSignupPlugin<T> extends PouchDB.Database<T> { 
    signup: (username: string, password: string, handler: (err: any, resp: any) => void) => any; 
} 

et de l'utiliser comme tel:

const remoteDB = new pouch<PouchDB.Core.Encodable>(
    'https://user.cloudant.com/databaseName', 
    { skip_setup: true } // a param wanted by the plugin 
) as PouchDBSignupPlugin<PouchDB.Core.Encodable>; 

alors vous devriez trouver que VSCode et tapuscrit reconnaîtra une méthode signup sur remoteDB.