typescript - archivo de definición para exportación de objetos y tipos
Muy bien, entonces tenemos un módulo de Node string-similarity que exporta dos funciones así (ver: https://github.com/aceakash/string-similarity/blob/master/compare-strings.js#L7-L8 )
module.exports = { compareTwoStrings, findBestMatch }
He elaborado un archivo de definiciones que funciona bastante bien, excepto que no puedo acceder a los tipos.
declare module "string-similarity" {
function compareTwoStrings(string1: string, string2: string): number;
function findBestMatch(string: string, targetStrings: string[]): Result;
interface Result {
ratings: Match[];
bestMatch: Match;
}
interface Match {
target: string;
rating: number;
}
export { compareTwoStrings, findBestMatch };
}
Soy muy nuevo en Typescript, así que mi pregunta es esta: ¿debería poder importar estos tipos? Yo pensaría que sí. Y además, ¿hay una manera idiomáticamente correcta de crear este archivo def?
Actualizar
Pude hacer que el intellisense en VSC pensara que había resuelto el problema, pero todavía obtengo el error TypeError: Cannot read property 'compareTwoStrings' of undefined. Aunque puedo ver los métodos perfectamente y no hay subrayados rojos.
index.d.ts
declare module "string-similarity" {
namespace similarity {
function compareTwoStrings(string1: string, string2: string): number;
function findBestMatch(string: string, targetStrings: string[]): Result;
}
export interface Result {
ratings: Match[];
bestMatch: Match;
}
export interface Match {
target: string;
rating: number;
}
export default similarity;
}
string-similarity.spec.ts
import similarity from "string-similarity";
import { Result, Match } from "string-similarity";
describe("compare two strings", () => {
it("works", () => {
const string1 = "hello";
const string2 = "dello";
const result: number = similarity.compareTwoStrings(string1, string2);
expect(result).toBe(0.75);
});
});
Respuesta #1
Parece que la línea export { ... } está limitando las exportaciones. (¡No sabía que era posible hacer eso en un bloque declare module!) Si elimino esa línea, entonces por defecto todo se exporta y puedo acceder a los tipos.
Respuesta #2
Para acceder a tus métodos bajo un padre común (por ejemplo similarity), necesitas importarlos bajo el alias similarity:
import * as similarity from "string-similarity";
similarity.compareTwoStrings("potato", "tomato");
