J'ai un JSON
fichier qui ressemble à ceci:
{
"primaryBright": "#2DC6FB",
"primaryMain": "#05B4F0",
"primaryDarker": "#04A1D7",
"primaryDarkest": "#048FBE",
"secondaryBright": "#4CD2C0",
"secondaryMain": "#00BFA5",
"secondaryDarker": "#009884",
"secondaryDarkest": "#007F6E",
"tertiaryMain": "#FA555A",
"tertiaryDarker": "#F93C42",
"tertiaryDarkest": "#F9232A",
"darkGrey": "#333333",
"lightGrey": "#777777"
}
J'essaye de l'importer dans un .tsx
fichier. Pour cela, j'ai ajouté ceci à la définition de type:
declare module "*.json" {
const value: any;
export default value;
}
Et je l'importe comme ça.
import colors = require('../colors.json')
Et dans le fichier, j'utilise la couleur primaryMain
comme colors.primaryMain
. Cependant, j'obtiens une erreur:
La propriété 'primaryMain' n'existe pas sur le type 'typeof "* .json"
json
angular
typescript
angular8
Sooraj
la source
la source
Réponses:
Le formulaire d'importation et la déclaration du module doivent convenir de la forme du module, de ce qu'il exporte.
Lorsque vous écrivez (une pratique sous-optimale pour l'importation de JSON depuis TypeScript 2.9 lors du ciblage de formats de modules compatibles voir note )
Vous déclarez que tous les modules dont le spécificateur se termine par
.json
ont une seule exportation nomméedefault
.Il existe plusieurs façons de consommer correctement un tel module, notamment
et
et
et
La première forme est la meilleure et le sucre syntaxique qu'elle exploite est la raison même pour laquelle JavaScript
default
exporte.Cependant, j'ai mentionné les autres formulaires pour vous donner une idée de ce qui ne va pas. Portez une attention particulière au dernier.
require
vous donne un objet représentant le module lui-même et non ses liaisons exportées.Alors pourquoi l'erreur? Parce que tu as écrit
Et pourtant, il n'y a pas d'export nommé
primaryMain
déclaré par votre"*.json"
.Tout cela suppose que votre chargeur de module fournit le JSON comme
default
exportation comme suggéré par votre déclaration d'origine.Remarque: depuis TypeScript 2.9, vous pouvez utiliser l'
--resolveJsonModule
indicateur du compilateur pour que TypeScript analyse les.json
fichiers importés et fournisse des informations correctes concernant leur forme, évitant ainsi le besoin d'une déclaration de module générique et validant la présence du fichier. Ceci n'est pas pris en charge pour certains formats de module cible.la source
await import('remotepath');
Avec TypeScript 2.9. +, Vous pouvez simplement importer des fichiers JSON avec typesafety et intellisense comme ceci:
Assurez-vous d'ajouter ces paramètres dans la
compilerOptions
section de votretsconfig.json
( documentation ):Notes secondaires:
import * as colorsJson from '../colors.json'
la source
esModuleInterop
, mais vous devez le faireimport * as foo from './foo.json';
- celaesModuleInterop
me causait d'autres problèmes lorsque j'ai essayé de l'activer."moduleResolution": "node"
dans votretsconfig.json
. Cela présente également l'inconvénient que les*.json
fichiers que vous souhaitez importer doivent se trouver à l'intérieur"rootDir"
. Source: blogs.msdn.microsoft.com/typescript/2018/05/31/…import * as foo from './foo.json'
c'est le mauvais formulaire d'importation. Il devrait l'êtreimport foo = require('./foo.json');
lorsque vous ne l'utilisez pasesModuleInterop
"resolveJsonModule": true
et tout va bienIl est facile d'utiliser la version 2.9+ dactylographiée. Ainsi, vous pouvez facilement importer des fichiers JSON comme @kentor le décrit .
Mais si vous devez utiliser des versions plus anciennes:
Vous pouvez accéder aux fichiers JSON de manière plus TypeScript. Tout d'abord, assurez-vous que votre nouvel
typings.d.ts
emplacement est le même que celui de lainclude
propriété dans votretsconfig.json
fichier.Si vous n'avez pas de propriété include dans votre
tsconfig.json
fichier. Ensuite, la structure de votre dossier devrait être comme ça:Mais si vous avez une
include
propriété dans votretsconfig.json
:Ensuite, vous
typings.d.ts
devriez être dans lesrc
répertoire comme décrit dans lainclude
propriétéComme dans la plupart des réponses, vous pouvez définir une déclaration globale pour tous vos fichiers JSON.
mais je préfère une version plus typée de ceci. Par exemple, disons que vous avez un fichier de configuration
config.json
comme celui-ci:Ensuite, nous pouvons déclarer un type spécifique pour cela:
Il est facile d'importer dans vos fichiers dactylographiés:
Mais en phase de compilation, vous devez copier manuellement les fichiers JSON dans votre dossier dist. Je viens d'ajouter une propriété de script à ma
package.json
configuration:la source
Dans votre fichier de définition TS, par exemple typings.d.ts`, vous pouvez ajouter cette ligne:
Ajoutez ensuite ceci dans votre fichier dactylographié (.ts): -
la source
any
dit deux choses. 1) que vous avez déclaré ou importé incorrectement à première vue simplement par définition. Vous ne devriez en aucun cas avoir besoin de placer une assertion de type sur une importation d'un module que vous avez vous-même déclaré. 2) même si vous avez un chargeur insensé qui fonctionne d'une manière ou d'une autre à l'exécution, Dieu vous en garde, ce serait toujours un moyen incroyablement déroutant et le plus fragile d'accéder à un module de la forme donnée.* as x from
etx from
sont encore plus incompatibles en termes d'exécution que ce qui est dans l'OP. Sérieusement, ne faites pas ça.Une autre façon d'aller
C'est ainsi que vous pouvez toujours définir le type json que vous voulez et ne pas avoir à utiliser de joker.
Par exemple, le type personnalisé json.
la source
Souvent, dans les applications Node.js, un .json est nécessaire. Avec TypeScript 2.9, --resolveJsonModule permet d'importer, d'extraire des types et de générer des fichiers .json.
Exemple #
la source