Eu tenho um JSON
arquivo que se parece com o seguinte:
{
"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"
}
Estou tentando importá-lo para um .tsx
arquivo. Para isso, adicionei isso à definição de tipo:
declare module "*.json" {
const value: any;
export default value;
}
E eu estou importando assim.
import colors = require('../colors.json')
E no arquivo, eu uso a cor primaryMain
como colors.primaryMain
. No entanto, recebo um erro:
A propriedade 'primaryMain' não existe no tipo 'typeof "* .json"
json
angular
typescript
angular8
Sooraj
fonte
fonte
Respostas:
O formulário de importação e a declaração do módulo precisam concordar sobre a forma do módulo, sobre o que ele exporta.
Quando você escreve (uma prática subótima para importar JSON desde o TypeScript 2.9 ao direcionar formatos de módulos compatíveis, consulte a nota )
Você está declarando que todos os módulos que possuem um especificador terminado em
.json
têm uma única exportação denominadadefault
.Existem várias maneiras de consumir corretamente esse módulo, incluindo
e
e
e
A primeira forma é a melhor e o açúcar sintático que ela aproveita é o motivo pelo qual o JavaScript
default
exporta.No entanto, mencionei as outras formas para lhe dar uma dica sobre o que está acontecendo de errado. Preste atenção especial ao último.
require
fornece um objeto que representa o próprio módulo e não suas ligações exportadas.Então, por que o erro? Porque você escreveu
E, no entanto, não há exportação nomeada
primaryMain
declarada pelo seu"*.json"
.Tudo isso pressupõe que o carregador de módulos esteja fornecendo o JSON como
default
exportação, conforme sugerido por sua declaração original.Nota: Desde o TypeScript 2.9, você pode usar o
--resolveJsonModule
sinalizador do compilador para que o TypeScript analise os.json
arquivos importados e forneça as informações corretas sobre sua forma, evitando a necessidade de uma declaração do módulo curinga e validando a presença do arquivo. Isso não é suportado para determinados formatos de módulo de destino.fonte
await import('remotepath');
Com o TypeScript 2.9. +, Você pode simplesmente importar arquivos JSON com segurança de tipo e inteligência como esta:
Certifique-se de adicionar essas configurações na
compilerOptions
seção datsconfig.json
( documentação ):Notas laterais:
import * as colorsJson from '../colors.json'
fonte
esModuleInterop
, mas precisa fazer issoimport * as foo from './foo.json';
-esModuleInterop
estava causando outros problemas para mim quando tentei ativá-lo."moduleResolution": "node"
no seutsconfig.json
. Também vem com a desvantagem de que os*.json
arquivos que você deseja importar precisam estar dentro"rootDir"
. Fonte: blogs.msdn.microsoft.com/typescript/2018/05/31/…import * as foo from './foo.json'
é o formulário de importação errado. Deve serimport foo = require('./foo.json');
quando não estiver usandoesModuleInterop
"resolveJsonModule": true
e está tudo bemÉ fácil usar a versão datilografada 2.9+. Assim, você pode importar facilmente arquivos JSON como o @kentor descrito .
Mas se você precisar usar versões mais antigas:
Você pode acessar arquivos JSON de maneira mais TypeScript. Primeiro, verifique se o seu novo
typings.d.ts
local é igual ao dainclude
propriedade no seutsconfig.json
arquivo.Se você não possui uma propriedade include no seu
tsconfig.json
arquivo. Então sua estrutura de pastas deve ser assim:Mas se você tem uma
include
propriedade no seutsconfig.json
:Então você
typings.d.ts
deve estar nosrc
diretório conforme descrito nainclude
propriedadeComo em muitas respostas, você pode definir uma declaração global para todos os seus arquivos JSON.
mas eu prefiro uma versão mais digitada disso. Por exemplo, digamos que você tenha um arquivo de configuração
config.json
assim:Em seguida, podemos declarar um tipo específico para ele:
É fácil importar nos seus arquivos datilografados:
Mas na fase de compilação, você deve copiar os arquivos JSON para a pasta dist manualmente. Acabei de adicionar uma propriedade de script à minha
package.json
configuração:fonte
No seu arquivo TS Definition, por exemplo, typings.d.ts`, você pode adicionar esta linha:
Em seguida, adicione isso no seu arquivo datilografado (.ts): -
fonte
any
diz duas coisas. 1) que você declarou ou importou incorretamente, simplesmente por definição. Você nunca deve, em circunstância alguma, precisar colocar uma declaração de tipo na importação de um módulo que você mesmo declarou. 2) mesmo que você tenha um carregador insano que de alguma forma funcione em tempo de execução, é proibido pelos deuses, ainda assim seria uma maneira incrivelmente confusa e mais frágil de acessar um módulo com a forma especificada.* as x from
ex from
têm um tempo de execução ainda mais incompatível do que o que está no OP. Sério, não faça isso.Outro caminho a percorrer
Foi assim que você ainda pode definir o tipo de json que deseja e não precisa usar curinga.
Por exemplo, tipo personalizado json.
fonte
Geralmente, nos aplicativos Node.js, é necessário um .json. Com o TypeScript 2.9, --resolveJsonModule permite importar, extrair tipos e gerar arquivos .json.
Exemplo #
fonte