这是我的用例:
我们在promise库周围有一个非常轻量级的抽象,因为由于各种原因,我们现在已经更改了好几次,而且我们不希望在整个应用程序中更改代码。
我想在express.request实例中添加一个中间件,通过扩展接口,我可以很容易地完成,如下所示:

declare namespace Express {
    export interface Request {
        loginP(user: any): void;
    }
}

把这个放进A.D.TS文件里,一切都很好,真是太棒了。
然而。这里是我的问题;在我的抽象中,我重新导出了我们正在使用的promise库的接口,这样我们就可以在整个应用程序中使用它,并进行良好的类型检查,而不需要到处都知道它的来源:
import * as bluebird from 'bluebird';

export {bluebird as PType};

这工作得很好;但是,扩展接口只在.d.ts文件不导出或导入任何内容时才工作,因此当我尝试让它实际返回的类型loginP返回PType<void>时,扩展突然停止工作:
import {PType} from '../lib/Promise';

declare namespace Express {
    export interface Request {
        loginP(user: any): PType<void>;
    }
}

(使用上面的代码,在接口上的任何地方都找不到成员loginP)。如果我删除import {PType}行,一切都会正常工作——除了我不能返回所需的类型。
有什么想法吗?我使用typescript 1.8.9和一个tsconfig文件,构建tsc -p .

最佳答案

我认为您的问题是您正在尝试执行模块合并(只要您的代码模块中有export/import语句就变为外部的)。即使它没有直接支持-你仍然可以这样做。
下面我将直接从“AA>”复制的代码作为示例来说明如何做到这一点:

// observable.ts stays the same
// map.ts
import { Observable } from "./observable";
declare module "./observable" {
    interface Observable<T> {
        map<U>(f: (x: T) => U): Observable<U>;
    }
}
Observable.prototype.map = function (f) {
    // ... another exercise for the reader
}


// consumer.ts
import { Observable } from "./observable";
import "./map";

let o: Observable<number>;
o.map(x => x.toFixed());

希望这有帮助。

10-06 04:45
查看更多