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.jsonsom 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;
}
