2016-12-14 2 views
0

Хотя этот вопрос не радиально-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! 
} 

Итак, почему вы только иногда приходится импортировать методы расширения? И что я могу сделать, чтобы мои методы расширения были «модульными»?

+0

Они, кажется, чтобы быть частью одного и того же модуля 'мой-class'. Может быть, это не так, если бы имя модуля было другим? –

+0

Вы имеете в виду изменение 'declare module './my-class" 'to' declare module "./my-class-extensions" '? –

+0

Да, вот что я имел в виду. Хотя я не был уверен, смогу ли ты это сделать. –

ответ

0

Чтобы ответить на вторую часть вашего вопроса, это работает:

// my-class.ts 
export class MyClass { 
    firstMethod =(): void => { 
     console.log("First method") 
    } 
} 

// my-class.extended.ts 
import { MyClass as MyClassBase } from './my-class' 

class MyClassExtended extends MyClassBase { 
    secondMethod =(): void => { 
     console.log("Second method") 
    } 
} 
export { MyClassExtended as MyClass } 

// index.ts 
import { MyClass } from './my-class.extended' 

let myClassInstance = new MyClass() 
myClassInstance.secondMethod() 

// Outputs "Second method" 
+0

Спасибо, но в этом подходе secondMethod не будет называется методом расширения. –

Смежные вопросы