我尝试使用Ajv(我使用打字稿)。
import { Ajv } from "ajv";
let ajv = new Ajv({allErrors: true});
只是想知道为什么会出现这个错误:
[ts]' Ajv'仅指类型,但在此处用作值。
我使用它和文档一样:
var Ajv = require('ajv');
var ajv = new Ajv(); // options can be passed, e.g. {allErrors: true}
var validate = ajv.compile(schema);
var valid = validate(data);
if (!valid) console.log(validate.errors);
但是我使用import而不是require,所以我没有设置变量,所以我想这会导致错误。在使用import
而不是require
?
所有代码:
import { Injectable } from "@angular/core";
import { Http, Headers, Response } from "@angular/http";
import { Configuration } from "../shared/configuration.model";
import { Observable } from "rxjs/Rx";
import { Ajv } from "ajv";
@Injectable()
export class ValidateJSONSchemaService {
constructor(private http: Http) { }
public valJson(json, schemaFile: string) {
return new Promise((resolve, reject) => {
this.http.get(schemaFile)
.toPromise()
.then(fileContents => fileContents.json())
.then((schema) => {
let ajv = new Ajv({allErrors: true});
ajv.validate(schema, json) ?
resolve() :
reject(new Error("JSON does not conform to schema: " + ajv.errorsText()));
}, err => reject(
new Error("Unable to get schema file contents:" + err))
);
});
};
}
答案 0 :(得分:10)
正如@elclanrs所说,使用import * as Ajv from 'ajv'
不试图获得信用,但这已经过了一年,我几乎错过了答案,因为没有任何标记为答案。
答案 1 :(得分:3)
只需在TS 10.45和Angular 8.x的Node 10.x中添加,我必须使用
// @ts-ignore
import Ajv = require('ajv');
注意@ ts-ignore,因为TSlint会抱怨以这种方式导入模块
然后稍后在我的代码中,我可以正常使用它。
const ajv = new Ajv();
使用import * as Ajv from 'ajv'
角钢将无法正确构建,因为我一直看到此错误
error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
打字稿编译器建议,因此您可以使用此导入方法来解决
Type originates at this import. A namespace-style import cannot be called or constructed, and will cause a failure at runtime. Consider using a default import or import require here instead.
希望这对使用角度8的人有所帮助。
答案 2 :(得分:0)
我需要将其导入节点项目,并且将其导入为:
import Ajv from 'ajv'
然后,您可以将其用作:
...
let ajv = new Ajv({allErrors: true});
...
我正在使用节点v12.8.1。