2017-01-09 47 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'路徑'工程!多謝 :) –