我有一个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;
}
我是这样导入的。
import colors = require('../colors.json')
在文件中,我将颜色primaryMain
用作colors.primaryMain
. 但是我收到一个错误:
属性 'primaryMain' 在类型 'typeof "*.json" 上不存在
导入形式和模块声明需要就模块的形状、导出的内容达成一致。
当你编写时(从 TypeScript 2.9 开始,在针对兼容的模块格式时导入 JSON 的次优做法,请参阅注释)
declare module "*.json" {
const value: any;
export default value;
}
就表示有结尾的符所有模块.json
只有一个出口命名 default
。
有几种方法可以正确使用这样的模块,包括
import a from "a.json";
a.primaryMain
和
import * as a from "a.json";
a.default.primaryMain
和
import {default as a} from "a.json";
a.primaryMain
和
import a = require("a.json");
a.default.primaryMain
第一种形式是最好的,它所利用的语法糖正是 JavaScript 具有default
导出功能的原因。
但是,我提到了其他形式,以提示你出了什么问题。特别注意最后一个。require
为你提供一个表示模块本身而不是其导出绑定的对象。
那么为什么会出错呢?因为你写了
import a = require("a.json");
a.primaryMain
然而primaryMain
,你的"*.json"
.
所有这些都假设你的模块加载器default
按照原始声明的建议提供 JSON 作为导出。
注意:从 TypeScript 2.9 开始,你可以使用--resolveJsonModule
编译器标志让 TypeScript 分析导入的.json
文件并提供有关其形状的正确信息,从而无需通配符模块声明并验证文件是否存在。某些目标模块格式不支持此功能。
@Royi 这取决于您的装载机。对于远程文件,请考虑使用
await import('remotepath');
继续滚动,下面有更多最新答案。
@jbmusso 我添加了一些关于 TypeScript 更高版本引入的改进的信息,但我不认为这个答案已经过时,因为它是概念性的。但是,我愿意接受进一步改进的建议。
风险在于有些人可以简单地复制/粘贴您答案的第一行,只解决症状而不是根本原因。我相信@kentor 的答案会产生更多细节并提供更完整的答案。建议将您的注释移到您的答案之上,明确说明这是迄今为止解决此问题的正确方法。
@Atombit 它显然对很多人都有效,包括我。在否决接受的答案之前,请注意解释什么不起作用?