使用 json 文件动态导入不起作用打字稿



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

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

这将引发:错误:找不到模块".."/测试数据.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__/*"]
}

有人能解释一下发生了什么吗?我该怎么办?

如果不使用导入断言,您实际上无法在TypeScript中动态导入json文件。TypeScript只允许您通过配置属性导入具有json扩展名的文件,遗憾的是,该属性与JavaScript规范不同,这可能会让许多人感到困惑。以下是导入断言的样子,但它们目前在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是您必须断言的,因为出于安全原因,不能使用文件扩展名来确定文件类型。

无论如何,异步获取Node.js中JSON的最佳方法是通过fs读取文本,然后使用JSON.parse。至少,在Node.js添加对导入断言的支持之前,我认为这在几年内不会使其稳定。

这里有一个例子:

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

根据这个Typescript线程

importAttributes";断言";由于从阶段3回归到阶段2,将不再支持。

他们正在谈论用";为什么";几个月以来。

最新更新