用导入语句替换Require语句导致错误

时间:2017-01-22 19:41:02

标签: typescript import require

我尝试使用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))
                );
        });
    };
}

3 个答案:

答案 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。