Tengo un JSON
archivo que se parece a lo siguiente:
{
"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"
}
Estoy tratando de importarlo a un .tsx
archivo. Para esto agregué esto a la definición de tipo:
declare module "*.json" {
const value: any;
export default value;
}
Y lo estoy importando así.
import colors = require('../colors.json')
Y en el archivo, uso el color primaryMain
como colors.primaryMain
. Sin embargo me sale un error:
La propiedad 'primaryMain' no existe en el tipo 'typeof "* .json"
json
angular
typescript
angular8
Sooraj
fuente
fuente
Respuestas:
El formulario de importación y la declaración del módulo deben estar de acuerdo sobre la forma del módulo, sobre lo que exporta.
Cuando escribe (una práctica subóptima para importar JSON desde TypeScript 2.9 cuando apunta a formatos de módulos compatibles, vea la nota )
Está declarando que todos los módulos que tienen un especificador que termina en
.json
tienen una única exportación denominadadefault
.Hay varias formas en que puede consumir correctamente un módulo como
y
y
y
La primera forma es la mejor y el azúcar sintáctico que aprovecha es la razón por la que JavaScript tiene
default
exporta.Sin embargo, mencioné las otras formas para darle una pista sobre lo que está mal. Presta especial atención al último.
require
le da un objeto que representa el módulo en sí y no sus enlaces exportados.Entonces, ¿por qué el error? Porque tu escribiste
Y sin embargo, no hay una exportación nombrada
primaryMain
declarada por su"*.json"
.Todo esto supone que su cargador de módulos proporciona el JSON como la
default
exportación como lo sugiere su declaración original.Nota: desde TypeScript 2.9, puede usar el
--resolveJsonModule
indicador del compilador para que TypeScript analice los.json
archivos importados y proporcione información correcta sobre su forma, evitando la necesidad de una declaración de módulo comodín y validando la presencia del archivo. Esto no es compatible con ciertos formatos de módulos de destino.fuente
await import('remotepath');
Con TypeScript 2.9. + Simplemente puede importar archivos JSON con typesafety e intellisense como este:
Asegúrese de agregar esta configuración en la
compilerOptions
sección de sutsconfig.json
( documentación ):Notas al margen:
import * as colorsJson from '../colors.json'
fuente
esModuleInterop
, pero debe hacerloimport * as foo from './foo.json';
:esModuleInterop
estaba causando otros problemas para mí cuando intenté habilitarlo."moduleResolution": "node"
en sutsconfig.json
. También viene con la desventaja de que los*.json
archivos que desea importar deben estar dentro"rootDir"
. Fuente: blogs.msdn.microsoft.com/typescript/2018/05/31/…import * as foo from './foo.json'
es el formulario de importación incorrecto. Debería serimport foo = require('./foo.json');
cuando no se usaesModuleInterop
"resolveJsonModule": true
y todo está bienEs fácil de usar la versión de mecanografiado 2.9+. Por lo tanto, puede importar fácilmente archivos JSON como @kentor describe .
Pero si necesita usar versiones anteriores:
Puede acceder a los archivos JSON de manera más TypeScript. Primero, asegúrese de que su nueva
typings.d.ts
ubicación sea la misma que con lainclude
propiedad en sutsconfig.json
archivo.Si no tiene una propiedad de inclusión en su
tsconfig.json
archivo. Entonces la estructura de su carpeta debería ser así:Pero si tiene una
include
propiedad en sutsconfig.json
:Entonces
typings.d.ts
debería estar en elsrc
directorio como se describe en lainclude
propiedadComo en muchas de las respuestas, puede definir una declaración global para todos sus archivos JSON.
pero prefiero una versión más tipada de esto. Por ejemplo, supongamos que tiene un archivo de configuración
config.json
como ese:Entonces podemos declarar un tipo específico para ello:
Es fácil importar en sus archivos de mecanografiado:
Pero en la fase de compilación, debe copiar los archivos JSON a su carpeta dist manualmente. Solo agrego una propiedad de script a mi
package.json
configuración:fuente
En su archivo de definición de TS, por ejemplo typings.d.ts`, puede agregar esta línea:
Luego agregue esto en su archivo de mecanografiado (.ts):
fuente
any
dice dos cosas. 1) que has declarado o importado incorrectamente en la cara simplemente por definición. Su deberían Nunca , bajo ninguna circunstancia hace falta colocar una afirmación de tipo en una importación de un módulo que haya declarado a sí mismo. 2) incluso si tienes un cargador loco que de alguna manera resuelve esto en tiempo de ejecución, Dios no lo quiera, aún sería una forma increíblemente confusa y la más frágil de acceder a un módulo de la forma dada.* as x from
yx from
son aún más incompatibles en tiempo de ejecución que lo que está en el OP. En serio no hagas esto.Otra forma de ir
Esto todavía puede definir el tipo json si lo desea y no tiene que usar comodines.
Por ejemplo, tipo personalizado json.
fuente
A menudo, en las aplicaciones Node.js se necesita un .json. Con TypeScript 2.9, --resolveJsonModule permite importar, extraer tipos y generar archivos .json.
Ejemplo #
fuente