2017-01-09 69 views
4

我试图使用validate.js库,它包含它自己的TypeScript声明文件。忽略捆绑的.d.ts并使用外部声明

不幸的是,它不是一个很好的打字库,DefinitelyTyped中有a much better one。我安装了@types/validate.js NPM软件包,但TypeScript没有使用它,而是使用与库直接捆绑的声明。

有什么办法可以让编译器使用我可用的更好的声明吗?

回答

4

您不能使用来自DefinitelyTyped的validate.js的声明,因为其中没有单个顶级export - 它们只是在ValidateJS名称空间内声明了一些接口。

而且至少对于节点(module=commonjs),您不能使用validate.js的捆绑声明,因为它们使用默认导出而不是export =

所以,你必须提供自己的声明以进口validate.js正确:

创建文件validate.d.ts

declare var validate: (attributes: any, constraints: any, options?: any) => any; 
export = validate; 

并告诉打字稿用它代替了一个在node_modules使用pathstsconfig.json

"compilerOptions": { 
    "baseUrl": ".", // This must be specified if "paths" is. 
    "paths": { 
     "validate.js": ["./validate.d.ts"] 
    } 
    } 

(请注意,您必须有baseUrl如果你有paths,所以设置"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' ] } 
+0

啊!是的,现在你提到它的DefinitelyTyped [测试validate.js](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/validate.js/validate.js-tests.ts#L1-L3)使用全局名称空间导入。有趣有趣的乐趣。但tsconfig'路径'工程!多谢 :) –