/ / ¿Puede VSCode / Typescript hacer inferencia de tipo en objetos modificados con plugin? - mecanografía, plugins, visual-studio-code, code-complete

¿Puede VSCode / Typescript hacer inferencia de tipo en objetos modificados con plugin? - mecanografía, plugins, visual-studio-code, code-complete

Estoy disfrutando de la ergonomía del desarrollador de VSCode y Typescript. Se ha producido un pequeño obstáculo cuando he aplicado un complemento a la pouchdb paquete:

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)} );

El código anterior trabaja en el navegador, pero mi experiencia de desarrollo se ve obstaculizada porque VSCode no reconoce los métodos de complemento agregado:

VSCode TS que reclama la propiedad de 'registro' no existe

¿Es este tipo de inferencia de tipo fuera del alcance de VSCode?

DE NOTA: No hay un paquete @types para este paquete en NPM: https://www.npmjs.com/package/@types/pouchdb-authentication Es un 404. ¿Es esa la pieza que falta?

Respuestas

1 para la respuesta № 1

Por lo que puedo decir de la documentación (https://pouchdb.com/api.html#plugins), el plugin método extiende tu PouchDB.Database Objeta con lo que sea que le pases.

Como tal en realidad, si usas pouch.plugin(require("pouchdb-authentication"));, entonces su base de datos ya no es de tipo PouchDB.Database<T>; En realidad, es una extensión de esa interfaz. Entonces, el hecho de que VSCode se esté quejando es correcto, ya que el tipo que ha declarado remoteDB tener no tiene un signup método.

Lo que puedes hacer es crear tu propia interfaz para remoteDB que se extiende PouchDB.Database<T> con cualquier método y propiedades pouchdb-authentication añade p.ej.

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

y usarlo como tal:

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>;

Entonces deberías encontrar que VSCode y TypeScript reconocerán un signup método en remoteDB.