使用 TypeScript 在节点应用程序中导入 JSON 文件
Posted
技术标签:
【中文标题】使用 TypeScript 在节点应用程序中导入 JSON 文件【英文标题】:Import JSON file in node application with TypeScript 【发布时间】:2017-12-09 06:53:35 【问题描述】:我真的快疯了,因为我找不到解决方案。 我要归档的是将带有配置的 JSON 文件导入我的 TypeScript 文件。 我知道我需要一个声明文件。所以我在我的项目中添加了一个文件 json-loader.d.ts 。我还在多个级别(根目录、typings 文件夹、custom_typings 文件夹)尝试了它,因为这是我找到的解决方案。 文件内容如下:
declare module "json!*"
let json: any;
export = json;
declare module "*.json"
const value: any;
export default value;
但编译器仍然告诉我,无法导入 JSON 文件,因为它不是模块。 那么,编译器是如何知道有这样一个声明文件的呢?
我已经尝试像这样修改我的 tsconfig.json:
"compilerOptions":
"target": "es6",
"module": "commonjs",
"outDir": "dist",
"typeRoots": [
"./node_modules/@types",
"./typings"
]
,
"include": [
"src/**/*.ts"
],
"exclude": [
"node_modules"
]
但它仍然不起作用。有什么建议吗?
谢谢!
【问题讨论】:
您能否展示一下您是如何尝试导入 json 的? 我试过了:import * as config from '../config.json'
。当 JSON 像我猜的模块一样处理时应该可以工作......
以防有人偶然发现这个问题。对于 nodejs 应用程序,您可以使用 npmjs.com/package/load-json-file
【参考方案1】:
Web 上使用 declare module "*.json"
的示例可以正常工作,因为 Webpack 被配置为加载 JSON 文件。
如果您不想为此烦恼,可以使用var
而不是import
:
var json = require('../config.json');
as suggested in this answer
【讨论】:
谢谢。这行得通。只是忘记运行将 .json 文件复制到 dist 目录的 gulp 任务... (ツ) 这让我摆脱了编译错误,但在运行时我仍然收到Cannot find module
错误。注意:尝试将 json 导入 jasmine 规范文件【参考方案2】:
我已成功使用以下内容在 CLI 程序中导入我的 package.json
(因此我可以在帮助页面中重复使用版本、许可证和描述信息)。
declare module '*.json'
const foo:
name: string;
version: string;
author: string;
license: string;
description: string;
;
export = foo;
或者,您可以导入包含接口描述等的其他文件,但您需要将导入放在模块声明中,例如
declare module 'ormconfig.json'
import Connection from "typeorm";
const foo: Connection[];
export = foo;
【讨论】:
你把上面的声明模块位,typings.d.ts 放在哪里了? @ArsalanKhalid 作为单独的文件,例如ormconfig.d.ts
代码中的任何位置都应该没问题...我通常将它们添加到 utils 文件夹或 typings
文件夹(如果我有很多)。【参考方案3】:
您是否做过类似在您的网页中添加 SystemJS 脚本来加载模块的操作 - index.html 等。我使用了 https://cdnjs.com/libraries/systemjs 和 iirc,您需要 https://cdnjs.cloudflare.com/ajax/libs/systemjs/0.20.14/system.src.js System.JS 是模块加载器.. 必须是导入的第一个脚本。 然后你需要这样的东西:
<script
src="https://cdnjs.cloudflare.com/ajax/libs/systemjs/0.20.14/system.src.js "/>
<script>
System.config(
defaultJSExtension:true
);
System.import('pathtoscriptwithoutdotjsatend');
</script>
【讨论】:
这是一个节点应用程序。没有网页。应该提到它......对不起。以上是关于使用 TypeScript 在节点应用程序中导入 JSON 文件的主要内容,如果未能解决你的问题,请参考以下文章
如何在 React 应用程序的 typescript 文件中导入 js 模块(使用绝对路径)?
如何使用对象解构在 TypeScript 中导入 JSON?