如何限制 `resolveJsonModule` 的范围?

How do I limit the scope of `resolveJsonModule`?

我正在开发使用 Typescript 和 webpack 的项目。我必须导入 json 个文件,我必须以两种方式进行:

使用package.json(已经实施)

要导入 package.jsontsconfig.json 包含:

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

并且 webpack 配置有:

  /**
   * 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 检查我的 package.jsonversion 字段。这是按预期工作的,我不想破坏它。

使用模式 json 文件(我正在实施的)

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

  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;

我仍然遇到类型错误:

Type '{ ... }' is not assignable to type 'string'.

改变resolveJsonModule

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

Module 'package.json' was resolved to 'secret/path/package.json', but '--resolveJsonModule' is not used.

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

据我所知,一旦设置了 --resolveJsonModule,就无法覆盖 json 类型。 您可以考虑禁用该标志并手动为 package.json 写入类型吗?它不是 time-consuming,因为您只使用了一个 package.json 字段。

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

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