2016-10-04 5 views
2

このような文書化された方法を使用してknockout定義をインストールしました。外部ライブラリd.tsで宣言されたインタフェースを拡張する方法?

npm install @types/knockout 

これはどこでもこのようにインポートできます。

import * as ko from "knockout"; 

しかし、私はKnockoutStaticインターフェイスをいくつかのカスタムのものに拡張することに固執しています。私はモジュールを使用するために<reference ... />namespaceベースの巨大なTSアプリケーションを移行しようとしています。以前は、拡張インタフェースをどこでもと宣言し、宣言がマージされました。私の拡張がこのように見えるとしましょう。

interface KnockoutStatic { 
    doSomething(): void; 
} 

私はこのように宣言したKnockoutExtensions.d.tsファイルを作成しようとしました。

import "knockout"; 

declare module "knockout" { 
    export interface KnockoutStatic { 
    doSomething(): void; 
    } 
} 

しかし、私はどこかknockoutと私の延長の両方をインポートする場合、TSはまだdoSomething呼び出しを解決することはできません。

import * as ko from "knockout"; 
import "./KnockoutExtensions"; 

ko.doSomething(); // error 

活字体2.0と新しいd.tsサブシステムを使用して、ライブラリ・インタフェースを拡張する適切な方法は何ですか?

TypeScript 2.0がインストールされたVisual Studio 2015 Update 3を使用しています。

答えて

0

モジュールの外部にインターフェイスを作成する必要があります。 ではなく、をエクスポートで宣言します。

module example { //...do stuff }

interface KnockoutStatic { doSomething(): void; }

あなたはきれいに保つためにあなたのインターフェースの拡張を追加するには、上のファイルを、することができます。

+0

これはうまくいきませんでした。これは、モジュールを使用していないときにのみ有効でしたが、純粋な名前空間でした。 –

0

問題は、knockout入力ファイルがexport =という構文を使用していることです。問題は「使いやすくなりました」ではありません。参照としてthisを参照してください。

私にとって最も簡単な解決策は、declare global { }に拡張子をラップすることでした。knockoutと入力ファイルがグローバルスコープのすべてを宣言しています。

declare global { 
    interface KnockoutStatic { 
    doSomething(): void; 
    } 
} 
0

「ノックアウト」などのタイプスクリプトの名前空間を簡単に拡張できます。

例:

/// <reference path="<path-to-typings-dir>/knockout/index.d.ts" /> 

declare module 'knockout' { 

    export interface CustomType { 

    customField: string; 

    customMethod(arg1: number, arg2: boolean): boolean; 
    } 

    namespace customNamespace { 

    export interface AnotherCustomType { 
     customField1: string; 
     customField2: boolean; 
    } 
    } 

    // NOTE: extending existing interface 
    export interface KnockoutStatic { 
    customMethod(): void; 
    } 
} 

注意をノックアウト-extension.d.tsファイルを作成します。このファイルはtypescriptですコンパイラによって、ピックアップされていることを確認してください。

拡張モジュールの新しく定義されたタイプを使用します。モジュールと名前空間の詳細については

// one way 
import { CustomType } from 'knockout'; 

const foo: CustomType; 

// second way 
import * as kc from 'knockout'; 

const foo: kc.CustomType; 
const bar: kc.customNamespace.AnotherCustomType; 

あなたはModulesNamespaces上の活字体のマニュアルを確認し、それらにtogetherを使用することができます。

乾杯!

関連する問題