json - Hur begränsar jag omfattningen av `resolveJsonModule`?


Jag arbetar på ett projekt som använder Typescript och webpack. Jag måste importera json-filer, och jag måste göra det på två sätt:

  • Jag måste importera projektets package.json som en modul. Detta har redan implementerats tidigare.
  • Måste importera några JSON-scheman som resurser som kan laddas via URL. Det här är vad jag arbetar med just nu.

Använder package.json (redan implementerat)

För att importera package.json, innehåller tsconfig.json:

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

Och webpack-konfigurationen har:

  /**
   * 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,
      }),
    ],
  },

Och så här används package.json:

import packageJson from "package.json";

//...

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

Detta är helt typ-säkert: ts kontrollerar att min package.json har version-fältet. Detta fungerar som avsett och jag vill inte bryta det.

Använder schema JSON-filer (det jag implementerar)

För att lägga till stöd för JSON-scheman har jag lagt till dem med filnamn som matchar .schema.json$ och har lagt till detta i webpack-konfigurationen:

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

Och detta till en global typdeklarationsfil:

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

Jag trodde att genom att göra det skulle Typescript tolka importen av en sådan fil som en enkel sträng. Jag har följt detta exempel.

Men när jag importerar schemafilen i mitt projekt:

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

// ...

uri = someSchemaUri;

Jag får fortfarande typfel:

Typen '{ ... }' kan inte tilldelas typen 'string'.

Ändrar resolveJsonModule

Om jag sätter resolveJsonModule-alternativet till false försvinner detta problem, men import av package.json från föregående avsnitt börjar ge ett fel:

Modul 'package.json' löstes till 'secret/path/package.json', men '--resolveJsonModule' används inte.

Hur konfigurerar jag mitt projekt så att Typescript skulle tolka dessa filer som en string, men samtidigt inte förlora typesäkerhet när jag importerar package.json från föregående avsnitt?

Svar #1

Såvitt jag vet finns det inget sätt att åsidosätta json-typer när --resolveJsonModule har satts. Kan du överväga att inaktivera den flaggan och skriva typer för package.json manuellt? Det tar inte mycket tid eftersom du bara använder ett package.json-fält.

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

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