使用express-validator打字稿定义

时间:2014-04-21 21:24:01

标签: node.js express typescript

我试图将部分代码转换为TypeScript,但是遇到快速验证器定义问题

我的代码如下所示:

///<reference path='../../../d.ts/node.d.ts' />
///<reference path='../../../d.ts/express.d.ts' />
///<reference path='../../../d.ts/express-validator.d.ts' />
import express = require('express');
import validator = require('express-validator');

function validate(req: express.Request, res: express.Response) {
    req.assert('name', 'Name is required').notEmpty();
    var errors = req.validationErrors();

    if (errors !== null && errors.length > 0) {
        res.json({
            result: false,
            errors: errors
        });
        return false;
    }
    return true;
}

Typescript编译器会生成以下错误:

error TS2094: The property 'assert' does not exist on value of type 'express.Request'.
error TS2094: The property 'validationErrors' does not exist on value of type 'express.Request'.

特别是在查看expreess-validator定义

时,这是有道理的
export interface RequestValidation {
    check(field: string, message: string): Validator;
    assert(field: string, message: string): Validator;
    sanitize(field: string): Sanitizer;
    onValidationError(func: (msg: string) => void): void;
}

我对RequestValidation接口的理解是它必须扩展express.Request接口,但修改此接口声明并没有真正帮助。

我做错了什么?

谢谢!

2 个答案:

答案 0 :(得分:1)

在我看来,Express Validator库扩展了Express Request对象。即它为Express中定义的现有Request添加了其他方法。

免责声明:我还没有找到Express Validator库的任何好文档,如果有人有链接,我可以更精确。

考虑到这一点,如果Express Validator库扩展了Express Request接口,那么定义应该反映这一点。以下是扩展Express and Express Validator on Definitely Typed的定义的示例。

declare module Express {
    interface Request extends ExpressValidator.RequestValidation {

    }
}

这将解决assert的问题,例如 - 如果有人找到了一些文档,我希望validatonErrors问题能够以类似的方式解决。

答案 1 :(得分:1)

我有一个帮助器function,用于检查'id' param对象上的request。在 TypeScript 1.5.0-beta 上正常工作的声明是:

// Somewhere at the top of your TypeScript code
/// <reference path="../../../../typings/tsd.d.ts" />
import ExpressValidator = require('express-validator');
import util = require('util');

我使用的辅助函数:

function getOnePreconditions(req:ExpressValidator.RequestValidation, res:express.Response, next:Function) {
    req.checkParams('id', 'Parameter Id is mandatory').notEmpty().isInt();
    var errors = req.validationErrors();
    if (errors) {
        res.send(400, 'errors' + util.inspect(errors));
    } else {
        next();
    }
}

如果您确实为项目定义了tsd.json并且您正确引用代码中的*.d.ts TypeScript 定义文件,那么肯定会为{添加声明文件{1}}使用:

express-validator