【问题标题】:Extend interface defined in .d.ts file扩展 .d.ts 文件中定义的接口
【发布时间】:2016-01-02 02:09:50
【问题描述】:

在我的 TypeScript 项目中,我使用 DefinitelyTyped 定义外部 js 依赖项。

有时这些定义可能已经过时。某些库也可能会在运行时添加新方法,例如 express-validator,您可以在其中定义自定义验证器函数。

因此,我想扩展那些 .d.ts 定义,添加新的方法和/或属性。

如果我在express-validator.d.ts 中有我的DefiniteTyped 定义:

declare module ExpressValidator {
  export interface Validator {
    is(): Validator;
    not(): Validator;
    isEmail(): Validator;
    ...
  }
}

如何在我的application.ts 中扩展Validator 接口?

///<reference path='../typings/tsd.d.ts' />

import expressValidator = require('express-validator');
export var app = express();

app.use(expressValidator({
    customValidators: {
        isArray: function(value) {
            return Array.isArray(value);
        }
 }
}));

// How to extend Validator interface adding isArray() method??

【问题讨论】:

    标签: interface typescript extends definitelytyped


    【解决方案1】:

    //如何扩展Validator接口添加isArray()方法??

    不能在作为模块的文件中执行此操作 (some guidance here),并且您的文件是一个模块,因为您有 import expressValidator

    改为创建一个extendedValidator.d.ts 并为 TypeScript 的引擎添加新内容:

    declare module ExpressValidator {
      export interface Validator {
         isArray: any;
      }
    }
    

    【讨论】:

    • 在创建d.ts 文件后,您是否需要对其执行特定操作?我已经这样做了,但我仍然得到我的新属性不存在的错误。我是否必须将其放在特定位置或执行其他操作才能使其被编译器识别?
    • @basarat 你必须“导出”接口吗?这是必需的吗?不导出会怎样?
    • @MohamedNuur 如果你想公开它,你必须导出它。
    • @NoNameProvided 在这个答案中为我澄清了这一点:stackoverflow.com/questions/41687894/… -- 希望你觉得它有用。
    【解决方案2】:

    按照https://www.credera.com/blog/technology-solutions/typescript-adding-custom-type-definitions-for-existing-libraries/ 的指示,我能够做到这一点。他们在那里使用react的例子。

    import 'react';
     
    declare module 'react' {
        interface OlHTMLAttributes<T> {
            type?: "1" | "a" | "A" | "i" | "I";
        }
    }
    

    我发现这对winston 也很有效。

    【讨论】:

    • 非常感谢。我只需要在.d.ts 文件的顶部导入模块
    猜你喜欢
    • 2015-09-03
    • 2016-10-18
    • 2017-05-08
    • 1970-01-01
    • 2016-02-15
    • 2020-06-03
    • 2017-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多