Хотя этот вопрос не радиально-2-специфический, давайте начнем с примером в угловых 2:Зачем вам иногда приходится импортировать методы расширения?
import { Http } from "@angular/http";
import "rxjs/add/operator/toPromise";
// ...
private foo() {
return this.http.get(url).toPromise();
}
toPromise()
является методом расширения для Observable<Response>
возвращаемого this.http.get(url)
. Его можно использовать, только если вы импортируете rxjs/add/operator/toPromise
, иначе компилятор будет жаловаться. Этот файл toPromise.d.ts
имеет следующее содержание:
import { toPromise } from '../../operator/toPromise';
declare module '../../Observable' {
interface Observable<T> {
toPromise: typeof toPromise;
}
}
Однако, для моих собственных методов расширения, нет импорта не требуется:
моего-class.ts:
export class MyClass {}
моего класс-расширения .:
import { MyClass } from "./my-class" ;
declare module "./my-class" {
interface MyClass {
myExtensionMethod;
}
}
MyClass.prototype.myExtensionMethod =() => {};
(В качестве альтернативы, последняя строка может быть удалена и файл может быть b е переименован в my-class-extensions.d.ts
)
мои-consumer.ts:.
import { MyClass } from "./my-class";
// No import necessary:
// import "./my-class-extensions";
// ...
foo(obj: MyClass) {
obj.myExtensionMethod(); // Still fine!
}
Итак, почему вы только иногда приходится импортировать методы расширения? И что я могу сделать, чтобы мои методы расширения были «модульными»?
Они, кажется, чтобы быть частью одного и того же модуля 'мой-class'. Может быть, это не так, если бы имя модуля было другим? –
Вы имеете в виду изменение 'declare module './my-class" 'to' declare module "./my-class-extensions" '? –
Да, вот что я имел в виду. Хотя я не был уверен, смогу ли ты это сделать. –