所以我写了一个这样的函数来获取多个环境的测试数据:
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,将不再支持。
他们正在谈论用";为什么";几个月以来。