¿Cómo declarar una clase TypeScript ambiental para un objeto prototipo de un paquete NPM?
Tengo un paquete NPM que tiene un objeto como el siguiente:
const Lipsum = function constructor(argOne, argTwo) {
...
}
Object.assign(Lipsum.prototype, {
firstMethod: function firstMethod(firstArg, secondArg){...}
secondMethod: function secondMethod(){}
})
module.exports = Lipsum;
Quiero declarar una clase TypeScript ambiental para ello. He creado un archivo en mi proyecto shared/lipsum.d.ts y escribí lo siguiente:
declare class Lipsum {
constructor(argOne: string, argTwo: number)
firstMethod(firstArg: string, secondArg: string): string
secondMethod(): void
}
export default Lipsum;
Estoy enfrentando el siguiente problema:
const x = new Lipsum(); // <--- this doesn't throw an error, even though the constructor must have two arguments.
x. // <--- It doesn't autocomplete here, but it autocompletes above when I put a dot after "Lipsum()".
Actualizar :
Intenté envolver la clase con una declaración de módulo, de la siguiente manera:
declare module 'lipsum'{
export default class Lipsum {
constructor(argOne: string, argTwo: number)
firstMethod(firstArg: string, secondArg: string): string
secondMethod(): void
}
}
Sigue diciéndome:
Nombre de módulo inválido en la ampliación. El módulo 'lipsum' se resuelve en un módulo sin tipar en '/Users/yaharga/project/node_modules/lipsum/lipsum.js', el cual no puede ser ampliado.
Debo notar que el código ya está en un archivo 'lipsum.d.ts'.
Resulta que todas las importaciones deben estar dentro del ámbito de "declare module". Gracias a @drag13 por señalarme la dirección correcta.
Para obtener más información sobre el error que estaba recibiendo, usé esta publicación como referencia.
Respuesta #1
Necesitas especificar el módulo al que se relaciona tu escritura. Simplemente agrega la definición del módulo como aquí
declare module 'MODULE_NAME' {
class Lipsum {
constructor(argOne: string, argTwo: number)
firstMethod(firstArg: string, secondArg: string): string
secondMethod(): void
}
export default Lipsum;
}
