【发布时间】:2017-12-16 12:20:04
【问题描述】:
我有一个描述对象 Person 的 json 模式。我希望能够以这种方式直接将该模式加载到打字稿文件中:
import Person from './schema/person.schema.json';
为此,我创建了一个加载器,它将 json 文件转换为 typescript 接口声明(使用json-schema-to-typescript),然后将结果传递给 ts-loader。
我的 webpack 是这样配置的:
webpack.config.js(摘录)
module: {
rules: [
{
test: /\.ts$/,
loader: 'ts-loader',
},
{
test: /\.schema\.json$/,
loader: 'ts-loader!jsonschema-loader',
exclude: /(node_modules)/,
},
]
},
在question 之后,我配置了一个声明,以便将 json 文件视为字符串:
declaration.d.ts:
declare module '*.schema.json' {
const schema: string;
export default schema;
}
我的加载器会即时更改它处理的文件名,所以 ts-loader 认为它加载的是person.schema.ts。此外,我检查了我的加载程序的结果是正确的。这里是:
/**
* This file was automatically generated by json-schema-to-typescript.
* DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file,
* and run json-schema-to-typescript to regenerate this file.
*/
export interface Person {
firstName: string;
lastName: string;
/**
* Age in years
*/
age?: number;
[k: string]: any;
}
但是,当我构建我的项目时,Person 未被识别为对象并且编译失败:
index.js
import Person from './schema/person.schema.json';
const person: Person = {
lastName: 'Doe',
firstName: 'John',
};
console.log(person);
编译失败:
ERROR in ./src/index.ts
(3,15): error TS2304: Cannot find name 'Person'.
虽然我在声明中将 .schema.json 文件的导出定义为字符串,但我的加载器会动态地将文件名 (this.resourcePath) 更改为 ts 文件,因此 ts-loader 应该将其视为标准 ts 文件并导出Person 对象。
我做错了什么?
【问题讨论】:
-
由于 Person 不是默认导出,请尝试: import { Person } from './schema/person.schema.json';
-
@Daniel 实际上,他需要
export default interface Person
标签: typescript webpack loader jsonschema