【发布时间】:2017-04-29 17:36:49
【问题描述】:
虽然这个问题不是 Angular-2 特有的,但让我们从 Angular 2 中的一个例子开始:
import { Http } from "@angular/http";
import "rxjs/add/operator/toPromise";
// ...
private foo() {
return this.http.get(url).toPromise();
}
toPromise() 是this.http.get(url) 返回的Observable<Response> 的扩展方法。只有导入rxjs/add/operator/toPromise才能使用,否则编译器会报错。该文件toPromise.d.ts 具有以下内容:
import { toPromise } from '../../operator/toPromise';
declare module '../../Observable' {
interface Observable<T> {
toPromise: typeof toPromise;
}
}
但是,对于我自己的扩展方法,不需要导入:
我的班级.ts:
export class MyClass {}
my-class-extensions.ts:
import { MyClass } from "./my-class" ;
declare module "./my-class" {
interface MyClass {
myExtensionMethod;
}
}
MyClass.prototype.myExtensionMethod = () => {};
(或者,可以删除最后一行并将文件重命名为my-class-extensions.d.ts。)
我的消费者.ts:
import { MyClass } from "./my-class";
// No import necessary:
// import "./my-class-extensions";
// ...
foo(obj: MyClass) {
obj.myExtensionMethod(); // Still fine!
}
那么,为什么您有时只需要导入扩展方法?我该怎么做才能使我的扩展方法“模块化”?
【问题讨论】:
-
它们似乎属于同一模块
my-class。难道模块名不一样就不是这样了吗? -
你的意思是把
declare module "./my-class"改成declare module "./my-class-extensions"? -
是的,我就是这个意思。虽然我不确定你是否可以这样做。
-
在这种情况下,扩展程序根本不起作用。编译器不会将
myExtensionMethod识别为MyClass的成员。 -
更准确地说:它将
myExtensionMethod识别为同义但不同的类MyClass的成员。