扩展打字稿界面

时间:2015-04-08 13:47:08

标签: interface typescript

在TypeScript中扩展Express.Request接口时遇到了我想要使用外部库定义的问题,但我无法导入外部库,因为它会导致错误 - >

错误:(4,28)TS1147:内部模块中的导入声明无法引用外部模块。

编辑:这是一个.d.ts文件

/// <reference path="../typings/express/express.d.ts" />

declare module Express {
    import bunyan = require('bunyan'); <-- results in error
    export interface Request {
        _id: string; <-- this works
        log: bunyan.Logger; <-- Here I want to define that it is bunyan.Logger instance;
    }
}

尝试引用bunyan.d.ts(https://github.com/borisyankov/DefinitelyTyped/blob/master/bunyan/bunyan.d.ts) 还会导致问题,因为bunyan模块导出为字符串

declare module "bunyan" {
...
}

因此尝试使用未找到的参考结果。

/// <reference path="../typings/express/express.d.ts" />
/// <reference path="../typings/bunyan/bunyan.d.ts" />

declare module Express {
    export interface Request {
        _id: string;
        log: bunyan.Logger; <- Error:(8, 18) TS2304: Cannot find name 'bunyan'.
    }
}

TL;博士;如何使用外部模块定义扩展接口定义。

2 个答案:

答案 0 :(得分:3)

我认为只有在需要require时才能添加到现有界面,但您可以使用extends关键字扩展现有界面。

将import语句移到模块外部,导出模块,并扩展现有接口:

import bunyan = require('bunyan');
import express = require('express');

export declare module ExtendedExpress {
    export interface Request extends express.Express.Request {
        _id: string;
        log: bunyan.Logger;
    }
}

然后你必须将这个模块导入你想要使用的地方。

答案 1 :(得分:1)

内部和外部模块的引用将在v1.5中得到改进,目前处于alpha版本(http://blogs.msdn.com/b/typescript/archive/2015/03/27/announcing-typescript-1-5-alpha.aspx)。

在此期间,您可以通过以下方式导入bunyan模块:

var bunyan = require('bunyan');