我正在从事使用Typescript和webpack的项目.我必须导入json文件,我必须通过两种方式来完成:

  • 我必须导入项目的package.json作为一个模块.这已经在以前实施过.
  • 必须导入一些json模式作为可由url加载的资源.这就是我现在正在做的.

Using package.json (already implemented)

要导入package.jsontsconfig.json包含:

{
  "compilerOptions": {
    "resolveJsonModule": true,
    "paths": {
      "package.json": ["./package.json"]
    }
  },
}

而网页包配置具有:

  /**
   * Determine the array of extensions that should be used to resolve modules.
   */
  resolve: {
    extensions: [".js", ".ts", ".tsx", ".json"],
    plugins: [
      new TSConfigPathsPlugin({
        configFile: path.join(__dirname, "../../tsconfig.json"),
        logLevel: "info",
        extensions: [".js", ".jsx", ".ts", ".tsx"],
        mainFields: ["browser", "main"],
        baseUrl: tsConfig.baseUrl,
      }),
    ],
  },

这就是package.json的用法:

import packageJson from "package.json";

//...

const release = `${packageJson.version}-${process.platform}`;

这是完全类型安全的:ts判断my package.json是否有version字段.这是预期的工作,我不想打破它.

Using schema json files (what I'm implementing)

为了添加对json模式的支持,我添加了与.schema.json$匹配的文件名,并将其添加到webpack config中:

  module: {
    rules: [
      {
        test: /\.schema.json$/,
        type: "asset/resource",
      },
    ],
  },

并将其转换为全局类型声明文件:

declare module "*.schema.json" {
  declare const uri: string;
  export default uri;
}

我认为通过这样做,Typescript将把导入这样一个文件解释为一个简单的字符串.我一直在跟踪this example人.

但是,当我在项目中导入架构文件时:

import someSchemaUri from "./schemas/some-name.schema.json";

// ...

uri = someSchemaUri;

我仍然收到类型错误:

键入"{…}"未分配

Changing resolveJsonModule

如果我将resolveJsonModule选项设置为false,,这个问题就会消失,但从上一节导入package.json会出现错误:

模块包.json"已解析为"secret/path/package.json",但未使用"-resolveJsonModule".

如何配置我的项目,以便Typescript将这些文件解释为string,但在我从上一节导入package.json时,某些文件不会失go 类型安全性?

推荐答案

我知道,一旦设置了--resolveJsonModule,就无法覆盖json类型.

declare module '*.schema.json' {
    const uri: string;
    export default uri;
}

declare module '*package.json' {
    const content: {
        version: string;
    };
    export default content;
}

Json相关问答推荐

使用Shell深入挖掘到最低的SON元素

用于参考的Jolt变换

导致此 Kotlin Retrofit2 错误的可能原因有哪些?

当列为空时从 SQL 获取 JSON

Jolt 变换以展平 json 字符串数组

如何对未知/变量键的字典进行编码?

使用 jq 获取所有嵌套键和值

如何在JQ中展平多维数组

我无法将来自 API 的数据显示到 FlatList 中,但我在 console.log 中看到了它.问题是什么?

jq:用列表包装所有第一级原子值

如何限制resolveJsonModule的范围?

使用基本身份验证通过 CURL 发布 JSON

Python - 如何将 JSON 文件转换为数据框

谷歌浏览器不允许我放置断点

使用 jq,将对象数组转换为具有命名键的对象

错误未判断调用put(K, V)作为原始类型java.util.HashMap的成员

使用 Python 3 读取 JSON 文件

Jackson JSON序列化,通过级别定义避免递归

AJAX 将 JavaScript 字符串数组发布到 JsonResult 作为 List 总是返回 Null?

YAML 将 5e-6 加载为字符串而不是数字