2016-08-05 7 views
3

カスタムノックアウトエクステンダを作成しましたが、ノックアウトの定義ファイルで提供されている既存のインターフェイスを拡張できません。定義にインポート文が必要な場合、既存のインタフェースをどのように拡張できますか?

エクステンダー/ Numeric.tsko.extenders.numericについてのコンパイラをできるように

import * as ko from "knockout"; 

function Extender(target: KnockoutObservable<number>, options: IOptions = {}): KnockoutObservable<number> { 
    // ... 
}; 

interface IOptions { 
    // ... 
} 

export {Extender as NumericExtender, IOptions as INumericExtenderOptions} 

Boot.ts

import * as ko from "knockout"; 
import {NumericExtender} from "./Extenders/Numeric"; 

class Boot {  
    public constructor() { 
     ko.extenders.numeric = NumericExtender; 
    } 
} 

、私は、既存のインタフェースを拡張する必要があります。

interface KnockoutExtenders { 
    numeric(target: KnockoutObservable<number>, options?: INumericExtenderOptions): KnockoutObservable<number>; 
} 

ここで私は困っている。

import {INumericExtenderOptions} from "./Extenders/Numeric"; 

しかし、インポート文が追加された場合、ファイルがモジュール、which makes it impossible to extend an existing interfaceと考えられている:INumericExtenderOptionsにアクセスするためには、私はimport文を必要とします。

importを避けるために、これを行う方法がありますか、またはIOptionsを定義ファイルに移動する必要がありますか?

答えて

2

ノックアウト宣言ファイルのグローバルバージョンを使用しているようです。私はモジュール宣言ファイル内からグローバルスコープで定義されたインタフェースを拡張することはできないと思います。いくつかの解決策があります。

  • 私は、最も簡単な解決策は、同様にグローバル名前空間にあなたのインターフェースを置くにあると思います。 IOptionsについては、これは次のようになります。

    // index.d.ts 
    interface IOptions { 
        // ¯\_(ツ)_/¯ 
    } 
    
    interface KnockoutExtenders { 
        numeric(target: KnockoutObservable<number>, options?: IOptions): KnockoutObservable<number>; 
    } 
    

    宣言ファイルは依然として世界的であるとして、今、あなたは、どこにでも数値関数でIOptionsとKnockoutExtendersにアクセスすることができます。

  • 別の解決策は、(私はあなたがすべてのノックアウトタイプでグローバルな名前空間を汚染しないという理由だけで、これは私の好ましい解決策だと思う)モジュールバージョンで引きになります。ノックアウトの場合:typings install --save knockout。次に、必要なときにいつでも、必要なタイプを具体的にインポートする必要があります。例えば。あなたのnumeric.tsは

    // src/numeric.ts 
    import { Observable } from "knockout" 
    
    export function Extender(target: Observable<number>, options: IOptions = {}): Observable<number> { 
        // ¯\_(ツ)_/¯ 
    }; 
    
    export interface IOptions { 
        // ¯\_(ツ)_/¯ 
    } 
    

    になります。次に、別の宣言ファイルでノックアウトモジュールを補強することができます。例えば:

    // index.d.ts 
    import { Observable } from "knockout" 
    import { IOptions } from './src/numeric' 
    
    declare module "knockout" { 
        interface Extenders { 
        numeric(target: Observable<number>, options?: IOptions): Observable<number> 
        } 
    } 
    

    次に、あなたはどこでもあなたのアプリケーション内の増補エクステンダーインタフェースを使用することができるはずです。

    // src/boot.js 
    import { extenders } from "knockout" 
    import { Extender } from "./numeric" 
    
    class Boot { 
        public constructor() { 
        extenders.numeric = Extender 
        } 
    } 
    
  • 最終的な解決策、おそらく最良のあなたの問題を解決する、モジュラー宣言ファイルを使用することですには、グローバルモジュールが追加されます。あなたの数字。tsは同じままで、あなたの宣言ファイルは、次のようになります。詳細については

    import { IOptions } from './src/numeric' 
    
    declare global { 
        interface KnockoutExtenders { 
        numeric(target: KnockoutObservable<number>, options?: IOptions): KnockoutObservable<number> 
        } 
    } 
    

、この上に行くためにいくつかの時間を見つけるために管理page on declaration merging from the typescript handbook.

+0

を見て、私は三分の一を使用して終了しました溶液。この時点で利用可能なKnockoutのモジュール版はないため、このケースでは2番目の解決策は機能しませんでした。 – Stijn

+0

奇妙な。 'typings install knockout'は、モジュールノックアウト宣言ファイルを確実にインストールします。しかし、これはあなたが望むファイルではないかもしれませんか? –

+0

私は実際のライブラリ:)入力しないことを意味します。私が物事を誤解し、ライブラリを「モジュール化」する方法がないかぎり? – Stijn

関連する問題