如何使用从另一个 .d.ts 文件导出的类型来扩充打字稿界面?
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
return PType<void>
时,它实际上是 returns,增强突然停止工作:
import {PType} from '../lib/Promise';
declare namespace Express {
export interface Request {
loginP(user: any): PType<void>;
}
}
(通过上面的代码,在界面的任何地方都找不到成员loginP
)。如果我删除 import {PType}
行,一切正常——除了我不能 return 我需要的类型。
有什么想法吗?我正在使用带有 tsconfig 文件的打字稿 1.8.9,使用 tsc -p .
进行构建
我认为你的问题是你正在尝试执行模块合并(一旦你的代码中有 export/import 语句 - 模块成为外部)。即使它不直接受支持 - 你仍然可以这样做。
下面我发布了直接从 typescript handbook 复制的代码,作为如何执行此操作的示例:
// 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());
希望对您有所帮助。
这是我的用例:
我们的 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
return PType<void>
时,它实际上是 returns,增强突然停止工作:
import {PType} from '../lib/Promise';
declare namespace Express {
export interface Request {
loginP(user: any): PType<void>;
}
}
(通过上面的代码,在界面的任何地方都找不到成员loginP
)。如果我删除 import {PType}
行,一切正常——除了我不能 return 我需要的类型。
有什么想法吗?我正在使用带有 tsconfig 文件的打字稿 1.8.9,使用 tsc -p .
我认为你的问题是你正在尝试执行模块合并(一旦你的代码中有 export/import 语句 - 模块成为外部)。即使它不直接受支持 - 你仍然可以这样做。
下面我发布了直接从 typescript handbook 复制的代码,作为如何执行此操作的示例:
// 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());
希望对您有所帮助。