我有一个JSON文件,看起来如下:

{

  "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"
}

我正试图将其导入到。tsx文件中。为此,我在类型定义中添加了如下内容:

declare module "*.json" {
  const value: any;
  export default value;
}

我像这样导入它。

导入颜色= require('../colors.json')

在文件中,我使用颜色primaryMain作为colors。primaryMain。但是我得到一个错误:

属性“primaryMain”在类型“*.json”中不存在


当前回答

使用typescript 2.9+版本很容易。因此,您可以轻松地导入JSON文件@kentor描述。

但如果你需要使用旧版本:

你可以用更多的TypeScript方式访问JSON文件。首先,确保新的typings.d.ts位置与tsconfig中的include属性相同。json文件。

如果在tsconfig中没有include属性。json文件。然后你的文件夹结构应该是这样的:

- app.ts
+ node_modules/
- package.json
- tsconfig.json
- typings.d.ts

但是如果你在tsconfig.json中有一个include属性:

{
    "compilerOptions": {
    },
    "exclude"        : [
        "node_modules",
        "**/*spec.ts"
    ], "include"        : [
        "src/**/*"
    ]
}

然后你的typings.d.ts应该在src目录中,如include属性所述

+ node_modules/
- package.json
- tsconfig.json
- src/
    - app.ts
    - typings.d.ts

在许多响应中,您可以为所有JSON文件定义一个全局声明。

declare module '*.json' {
    const value: any;
    export default value;
}

但我更喜欢打字的版本。例如,假设您有配置文件config。这样的Json:

{
    "address": "127.0.0.1",
    "port"   : 8080
}

然后我们可以为它声明一个特定的类型:

declare module 'config.json' {
    export const address: string;
    export const port: number;
}

它很容易在你的typescript文件中导入:

import * as Config from 'config.json';

export class SomeClass {
    public someMethod: void {
        console.log(Config.address);
        console.log(Config.port);
    }
}

但是在编译阶段,您应该手动将JSON文件复制到dist文件夹。我只是向我的包添加了一个脚本属性。json配置:

{
    "name"   : "some project",
    "scripts": {
        "build": "rm -rf dist && tsc && cp src/config.json dist/"
    }
}

其他回答

在我的情况下,我需要改变tsconfig.node.json:

{
  "compilerOptions": {
    ...
    "resolveJsonModule": true
  },
  "include": [..., "colors.json"]
}

像这样导入:

import * as colors from './colors.json'

或者像这样:

import colors from './colors.json'

with "esModuleInterop": true

下面是如何在运行时导入json文件

import fs from 'fs'
var dataArray = JSON.parse(fs.readFileSync('data.json', 'utf-8'))

这样就避免了在导入大文件时tsc变慢或内存不足的问题,这些问题都可能发生在使用resolveJsonModule时。

使用TypeScript 2.9。+你可以简单地导入JSON文件,这样做有类型安全和智能感知的好处:

import colorsJson from '../colors.json'; // This import style requires "esModuleInterop", see "side notes"
console.log(colorsJson.primaryBright);

确保在tsconfig的compilerOptions部分添加这些设置。json(文档):

"resolveJsonModule": true,
"esModuleInterop": true,

边注:

Typescript 2.9.0在这个JSON特性上有一个bug,它在2.9.2被修复了 esModuleInterop只对colorsJson的默认导入是必需的。如果你将其设置为false,那么你必须使用import * as colorsJson从'../colors.json'导入它

注意,如果你使用@kentor ways

确保在tsconfig的compilerOptions部分添加这些设置。json(文档):

你需要在tsc命令后面添加——resolveJsonModule和——esModuleInterop来编译TypeScript文件。

例子: tsc——resolveJsonModule——esModuleInterop main.ts

在我的情况下,我必须改变:"include": ["src"]到"include":["。除了“resolveJsonModule”:true,因为我试图导入manifest。Json来自项目的根目录,而不是来自。/src