Búsqueda de sitios web

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