导入json文件时,Typescript编译器错误

Ken*_*Ken 52 javascript json commonjs node.js typescript

所以代码很简单:

calls.json

{"SERVER":{
    "requests":{
      "one":"1"
    }
} }
Run Code Online (Sandbox Code Playgroud)

file.ts

import json = require('../static/calls.json');
console.log(json.SERVER);
Run Code Online (Sandbox Code Playgroud)

生成的javascript是正确的,当运行节点js服务器时,控制台日志json.SERVER打印出'{requests:{one:'1'}}',就像它应该的那样.

但是,打字稿编译器(commonjs),不知何故并不特别喜欢这种情况并抛出:"找不到模块'../static/calls.json'".

当然我试着写一个.d.ts文件,像这样:

declare module '../static/calls.json'{
    var exp:any;
    export = exp;
}
Run Code Online (Sandbox Code Playgroud)

这显然会抛出:"Ambient模块声明不能指定相对模块名称".

我也尝试了不同的变体,例如:

declare module 'calls.json' {
    import * as json from '/private/static/calls.json';
    export = json;
}
Run Code Online (Sandbox Code Playgroud)

然后要求:

import json = require('calls.json');
Run Code Online (Sandbox Code Playgroud)

没有正常工作,并有自己的小编译器错误:)

我想使用外部.json文件,因为我使用commonjs serverside和amd clientside,我想要一个文件来加载常量.

tho*_*epo 80

var而不是import.

var json = require('./calls.json');
Run Code Online (Sandbox Code Playgroud)

您正在加载JSON文件,而不是模块,因此import在这种情况下不应使用.当var被使用,require()就像一个正常的功能再次处理.

如果您使用的是Node.js定义,那么一切都应该正常工作,否则require需要定义.

  • @thoughtrepo可以详细说明你的答案吗?从Babel到ES5的Typescript仍然在寻找一个模块.我发现自己处于这种情况,虽然故障安全的直觉是将json导入为`var config = require('./ config.json')`,但Typescript-Babel仍然表示相同的'无法找到module .config.json'错误消息. (7认同)

iti*_*skj 25

另一个解决方案是更改data.json为这样data.ts并导出

export default {
  "key" : {
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

并按照您的预期导入:

import { default as data } from './data'
Run Code Online (Sandbox Code Playgroud)

  • 从'./data.ts'导入{默认为数据}; (8认同)

sab*_*ker 21

可以通过使用完成import,如果使用语句的WebPack V2这已经是挤满了JSON-装载机.

请注意,这不是异步

import data from './data.json';//Note that this is not async
Run Code Online (Sandbox Code Playgroud)

此外,在您的typings.d.ts文件中添加以下通配符模块以避免打字稿错误说:Cannot find module

declare module "*.json" {
    const value: any;
    export default value;
}
Run Code Online (Sandbox Code Playgroud)

对于任何对async进口感兴趣的人,请通过2uality查看本文


Mat*_*ner 18

TS 2.9 增加了对良好类型的json导入的支持.只需添加:

{
  "compilerOptions": {
    "resolveJsonModule": true
  }
}
Run Code Online (Sandbox Code Playgroud)

在你tsconfig.jsonjsconfig.json.现在进口如下:

import json = require('../static/calls.json');
Run Code Online (Sandbox Code Playgroud)

import * as json from '../static/calls.json';
Run Code Online (Sandbox Code Playgroud)

应该解决并有适当的打字!

  • 这仅在您的目标是 `commonjs` 时才有效,如果您想输出其他任何内容,它将不起作用 (3认同)
  • 不起作用请参阅此[github问题](https://github.com/Microsoft/TypeScript/issues/25400) (2认同)
  • 无论_目标_如何,都能完美工作。我[和许多其他人](https://github.com/microsoft/TypeScript/issues/25400#issuecomment-449722146)确实必须**重新启动 VS Code** 才能让 Intellisense 停止吠叫。 (2认同)