Zoeken op website

Dynamische import met json-bestand werkt niet in TypeScript


Dus ik schrijf een functie zoals deze om testgegevens voor meerdere omgevingen te krijgen:

export class DataHelper {
  public static async getTestData(fileName: string): Promise<any> {
    return await import(`../${fileName}`);
  }
}

dit zal een fout veroorzaken: Fout: Kan module '../test-data.json' niet vinden

await DataHelper.getTestData('test-data.json')

maar dit zal werken:

await DataHelper.getTestData('TestScript')

ook dit zal werken:

await import('../test-data.json')

dit is mijn tsconfig.json

{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs",
    "declaration": true,
    "sourceMap": true,
    "outDir": "./lib",
    "moduleResolution": "node",
    "baseUrl": ".",
    "esModuleInterop": true,
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true,
    "resolveJsonModule": true
  },
  "include": ["src", "example/**/*"],
  "exclude": ["node_modules", "**/__tests__/*"]
}

Kan iemand uitleggen wat er gebeurt en wat ik in plaats daarvan moet doen?

Antwoord #1

Je kunt in feite geen json-bestanden dynamisch importeren in TypeScript zonder het gebruik van importverklaringen. TypeScript staat je simpelweg toe bestanden met de json-extensie te importeren via een configuratie-eigenschap, die helaas verschilt van de JavaScript-specificatie, wat voor veel mensen erg verwarrend kan zijn. Zo zien de importverklaringen eruit, maar ze worden momenteel niet ondersteund in Node.js:

// static import
import data from "./foo.json" assert { type: "json" };

// dynamic import
const { default: data } = await import("./foo.json", { assert: { type: "json" } });

TLDR daarover is dat je moet bevestigen omdat de bestandsextensie niet kan worden gebruikt om het bestandstype te bepalen om veiligheidsredenen.

Hoe dan ook, de beste manier om de JSON asynchroon in Node.js te krijgen, is door de tekst te lezen via fs en vervolgens JSON.parse te gebruiken. Tenminste, totdat Node.js ondersteuning toevoegt voor importasserties, waarvan ik aanneem dat het nog een paar jaar zal duren voordat het op de stabiele versie beschikbaar is.

Hier is een voorbeeld:

import { readFile } from "fs/promises";

async function readJsonFile(path) {
  const file = await readFile(path, "utf8");
  return JSON.parse(file);
}

readJsonFile("./package.json").then((data) => {
  console.log(data);
});

Gerelateerde artikelen