2016-12-14 14 views
0

、のは角2の例から始めてみましょう:拡張メソッドをインポートする必要があるのはなぜですか?この質問は、角-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をインポートする場合にのみ使用することができます。そうしないと、コンパイラは不平を言います。

import { toPromise } from '../../operator/toPromise'; 
declare module '../../Observable' { 
    interface Observable<T> { 
     toPromise: typeof toPromise; 
    } 
} 

しかし、私自身の拡張メソッドのために、何のインポートが必要ありません:

私-class.ts:

export class MyClass {} 

私のクラス-拡張子このファイルtoPromise.d.tsには、次の内容を持っています.ts:

import { MyClass } from "./my-class" ; 

declare module "./my-class" { 
    interface MyClass { 
     myExtensionMethod; 
    } 
} 
MyClass.prototype.myExtensionMethod =() => {}; 

(または、最後の行を削除してファイルをb my-class-extensions.d.tsに改名E)

私-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 "を' '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は拡張方法と呼ばれる。 –

関連する問題