node.js - TypeError: .... är inte en konstruktor i NodeJs & Typescript


Jag känner att jag har läst hela internet om detta, men jag kan helt enkelt inte lista ut vad problemet är: jag har ett Node.js/TypeScript-projekt här och behöver använda ett bibliotek som heter KDTree. Från dess README måste jag använda det så här:

const { default: KDTree } = require("kd-tree-ts");
const tree = new KDTree;

eftersom jag genom min tsconfig behöver lägga till bibliotek via import ... from '...' gör jag det så här:

import KDTree from 'kd-tree-ts'
    const tree = new KDTree

försökte också:

import * as  KDTree from 'kd-tree-ts'
    const tree = new KDTree.default

men: på den nya KDTree-raden får jag detta fel: TypeError: KDTree är inte en konstruktor (men det är det! --> https://github.com/NickNaumenko/kd-tree-ts/blob/develop/src/kdTree.ts ) och jag har helt noll idé om var och vad som orsakar det. Jag känner att det är något i tsconfig men för detta projekt kan jag inte ändra det.

detta är tsconfig:

{
  "compilerOptions": {
    "target": "es2016",
    "lib": [
      "es2019"
    ], 
    "module": "ESNext", 
    "rootDir": "src",
    "moduleResolution": "node",
    "outDir": "./bin",
    "esModuleInterop": true,
    "forceConsistentCasingInFileNames": true,
    "strict": true,
    "noImplicitAny": true,
    "skipLibCheck": true
  }
}

Om någon kunde visa mig rätt riktning skulle det vara fantastiskt!

Svar #1

Testade ett minimiprojekt och detta verkar fungera:

import KDTree from 'kd-tree-ts';
const tree = new KDTree()

Observera att du behöver använda parenteserna när du skriver new KDTree()

Svar #2

{
  "compilerOptions": {
    "target": "es2016",
    "lib": [
      "es2019"
    ], 
    "module": "ESNext", 
    "rootDir": "src",
    "moduleResolution": "node",
    "outDir": "./bin",
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "forceConsistentCasingInFileNames": true,
    "strict": true,
    "noImplicitAny": true,
    "skipLibCheck": true
  }
}

Lägg till "allowSyntheticDefaultImports": true, efter "esModuleInterop" för att stödja syntetiska standardimporter.

UPPDATERING:

kd-tree-ts har ett beroende av tslib vid byggtid, vilket indikerar att tslib-hjälpmedlet bör finnas i appen. Har du inkluderat tslib i din package.json?

Prova detta och se vilket fel du får. Kanske misslyckas initialiseringen innan modulen exporteras. Om du debuggar och fångar alla okända undantag, se om du kan få ett annat fel.

Om du kan skapa ett offentligt repo kan vi hjälpa dig att felsöka problemet.