2016-10-04 73 views
2

我使用這種文檔化的方法安裝了knockout定義。如何擴展在外部庫d.ts中聲明的接口?

npm install @types/knockout 

它很好用,我可以在任何地方像這樣導入它。

import * as ko from "knockout"; 

但是,我堅持延長KnockoutStatic接口與一些自定義的東西。我正嘗試將基於大型TS應用程序的<reference ... />namespace遷移到使用模塊。之前,我輕鬆地宣佈擴展接口任何地方和聲明合併。假設我的擴展是這樣的。

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

您可以輕鬆地擴展'knockout'或任何其他TypeScript命名空間。

示例:創建淘汰賽extension.d.ts文件

/// <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; 
    } 
} 

注:確保打字稿編譯器這個文件被拾取。

使用擴展模塊中新定義的類型。

// 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

乾杯!