这是我的用例:
我们在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());
希望这有帮助。