[英]How can I augment a typescript interface using a type exported from another .d.ts file?
这是我的用例:
我们的Promise库有一个非常轻量级的抽象,因为我们现在因各种原因已经多次更改了它,我们不希望在整个应用程序中更改代码。
我想在express.Request实例中添加一个中间件,我可以通过扩充界面轻松完成,如下所示:
declare namespace Express {
export interface Request {
loginP(user: any): void;
}
}
把它放在一个.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}
行,一切正常 - 除了我无法返回我需要的类型。
有任何想法吗? 我正在使用带有tsconfig文件的typescript 1.8.9,使用tsc -p .
构建tsc -p .
我认为您的问题是您正在尝试执行模块合并(只要您的代码中有导出/导入语句 - 模块变为外部)。 即使它没有直接支持 - 你仍然可以这样做。
下面我发布直接从typescript手册复制的代码作为如何执行此操作的示例:
// 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());
希望这可以帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.