typescript - def-fil för objektexport och typer


Okej, så vi har ett Node-modul string-similarity som exporterar två funktioner på detta sätt (se: https://github.com/aceakash/string-similarity/blob/master/compare-strings.js#L7-L8 )

module.exports = { compareTwoStrings, findBestMatch }

Jag har satt ihop en definitionsfil som fungerar ganska bra, förutom att jag inte kan få åtkomst till typerna.

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

Jag är väldigt ny på Typescript så min fråga är denna: borde jag kunna importera dessa typer? Det skulle jag tro. Och också, finns det ett idiomatiskt korrekt sätt att skapa denna def-fil?

Uppdatera

Jag lyckades få intellisense i VSC att tro att jag hade löst problemet, men jag får fortfarande felet TypeError: Cannot read property 'compareTwoStrings' of undefined. Även om jag kan se metoderna utan problem och inga röda understrykningar.

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

Svar #1

Det ser ut som att raden export { ... } begränsar exporterna. (Jag var inte medveten om att det är möjligt att göra det i ett declare module-block!) Om jag tar bort den raden, då exporteras allt som standard och jag kan komma åt typerna.

Svar #2

För att få åtkomst till dina metoder under en gemensam förälder (t.ex. similarity), behöver du importera dem under aliaset similarity:

import * as similarity from "string-similarity"; 

similarity.compareTwoStrings("potato", "tomato");