JΛY*_*ÐΞV 10 json typescript tsconfig
我引用的设置显示在下面的代码片段中
{
"compilerOptions": {
"resolveJsonModule": true,
}
}
Run Code Online (Sandbox Code Playgroud)
我不太明白为什么 TS 语言工程师会为 ? 添加一个标志"resolveJsonModule"?环境支持通过import语句(或require()方法)将 JSON 解析为模块,或者环境不支持。为什么要费心额外的复杂性呢?
jse*_*ksn 14
从历史上看,Node 包含了一个专门的 JSON 加载器(与 ECMA 标准无关),以允许仅在 CommonJS 模式下导入 JSON 数据。
任何东西的标准化导入(ES 模块)只是 ECMAScript 中相对较新的现象。仍仅处于第 3 阶段的提案中描述了导入包含有效 JSON 并解析为原生 JS 数据的文本文件(“导入 JSON”)。
然而,最近在实施上述提案方面出现了一些进展:
v4.5.0于 2021 年 11 月实现v1.17.0于 2021 年 12 月实施v16.14.0于 2022 年 2 月实现了它(在 CLI 标志后面--experimental-json-modules)TypeScript 是一个静态类型检查器,也是一个编译器(技术上是转译器),并将 TS 源代码语法转换为对于您在 TSConfig 中指定的运行时环境有效的 JavaScript 语法。由于不同的运行时环境具有不同的功能,因此配置编译器的方式会影响发出的转换后的 JavaScript。关于默认值,编译器使用算法逻辑来确定设置。(我无法在这里总结这一点:老实说,您必须阅读整个 参考资料才能理解它。)因为直到最近,加载 JSON 数据一直是一种非标准的专门操作,所以它并不是默认操作。
所有 JS 运行时都提供了import用于导入文本 JSON 数据(然后可以使用 解析JSON.parse)的语句的替代方案,并且它们都不需要按照您询问的方式配置编译器:
注意:从使用这些方法导入的 JSON 字符串解析的数据将不会参与编译器模块图的“自动”类型推断功能,因为它们不是编译图的一部分:因此它们将被键入为
any(或可能unknown在极其严格的配置中)。
window.fetchDeno.readTextFilefs.readFile此外,由于所有 JSON(JavaScript 对象表示法)都是有效的 JS,因此您只需在 JSON 文件中的数据前面添加
export default,然后将文件保存为 ,data.js而不是data.json,然后将其导入为标准模块:import { default as data } from "./data.js";。
关于推断类型的最后说明:
我更喜欢审核我导入的 JSON 并使用我自己手动编写的类型(由我自己或其他人编写:从模块/声明文件导入)作为数据,而不是依赖编译器从导入中推断出的类型语句(我发现在很多情况下都太窄了),通过使用类型断言将解析后的 JSON 数据分配给新变量。
| 归档时间: |
|
| 查看次数: |
13262 次 |
| 最近记录: |