【发布时间】:2017-05-24 08:12:59
【问题描述】:
我正在尝试使用 validate.js 库,其中包含自己的 TypeScript 声明文件。
不幸的是,它不是一个很好的库类型,并且在definitelyTyped 中有a much better one。我安装了@types/validate.js NPM 包,但 TypeScript 没有使用它,而是使用直接与库捆绑的声明。
有没有办法让编译器使用我现有的更好的声明?
【问题讨论】:
标签: typescript
我正在尝试使用 validate.js 库,其中包含自己的 TypeScript 声明文件。
不幸的是,它不是一个很好的库类型,并且在definitelyTyped 中有a much better one。我安装了@types/validate.js NPM 包,但 TypeScript 没有使用它,而是使用直接与库捆绑的声明。
有没有办法让编译器使用我现有的更好的声明?
【问题讨论】:
标签: typescript
您不能单独使用来自definiteTyped 的validate.js 声明,因为其中没有一个顶级export - 它们只是在ValidateJS 命名空间内声明一些接口。
您不能对validate.js 使用捆绑声明,至少对于节点 (module=commonjs),因为它们使用默认导出而不是 export =。
因此,您必须提供自己的声明才能正确导入 validate.js:
创建文件validate.d.ts:
declare var validate: (attributes: any, constraints: any, options?: any) => any;
export = validate;
并告诉 typescript 使用它而不是 node_modules 中的那个,使用 paths in tsconfig.json:
"compilerOptions": {
"baseUrl": ".", // This must be specified if "paths" is.
"paths": {
"validate.js": ["./validate.d.ts"]
}
}
(请注意,如果您有paths,则必须有baseUrl,如果您还没有设置为其他值,请设置"baseUrl" : ".")
那你就可以这样使用了(ValidateJS.Constraints和其他人只要你npm install @types/validate.js就可以立即使用):
import validate = require('validate.js');
let constraints: ValidateJS.Constraints = {
'foo': {presence: true}
};
let e = validate({}, constraints);
console.dir(e);
输出:
{ foo: [ 'Foo can\'t be blank' ] }
【讨论】:
paths 有效!非常感谢:)