使用json文件动态导入不起作用typescript

nzkunb0c  于 2023-04-13  发布在  TypeScript
关注(0)|答案(1)|浏览(254)

所以我写了一个这样的函数来获取多个环境的测试数据:

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

这将抛出:错误:找不到模块“website.json”

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

但这个可以

await DataHelper.getTestData('TestScript')

这也将起作用:

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

这是我的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__/*"]
}

谁能解释一下发生了什么,我应该怎么做?

2ledvvac

2ledvvac1#

如果不使用importAssert,你实际上无法在TypeScript中动态导入json文件。TypeScript只允许你通过配置属性导入扩展名为json的文件,这与JavaScript规范有很大的不同,这可能会让很多人感到困惑。下面是importAssert的样子,但它们目前在Node.js上不支持:

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

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

也就是说,您必须AssertTLDR,因为出于安全原因,不能使用文件扩展名来确定文件类型。
无论如何,在Node.js中异步获取JSON的最佳方法是通过fs读取文本,然后使用JSON.parse。至少,直到Node.js添加了对导入Assert的支持,我认为这在几年内不会稳定。
下面是一个例子:

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

事后

你仍然可以使用require来加载JSON文件,但我强烈建议不要这样做,因为它是同步的,所以它会停止你的程序的整个进程。

相关问题