【问题标题】:Ignore bundled .d.ts and use external declarations忽略捆绑的 .d.ts 并使用外部声明
【发布时间】:2017-05-24 08:12:59
【问题描述】:

我正在尝试使用 validate.js 库,其中包含自己的 TypeScript 声明文件。

不幸的是,它不是一个很好的库类型,并且在definitelyTyped 中有a much better one。我安装了@types/validate.js NPM 包,但 TypeScript 没有使用它,而是使用直接与库捆绑的声明。

有没有办法让编译器使用我现有的更好的声明?

【问题讨论】:

    标签: typescript


    【解决方案1】:

    您不能单独使用来自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' ] }
    

    【讨论】:

    • 啊!是的,既然您提到它,DefinitelyTyped tests for validate.js 使用全局命名空间导入。好玩好玩。但 tsconfig paths 有效!非常感谢:)
    猜你喜欢
    • 2016-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多