2017-05-30 12 views
0

大規模なサードパーティ製のAPI(名前は無実/無罪を保護するために難読化されています)に呼び出しをラップするTypescriptモジュールがあります。このAPIのTypeScript関数を追加する方法

// MyFile.ApiLib.ts 
export module ApiLib { 
    export function executeAction<TRequest, TResponse>(actionName: string, data: TRequest): Promise<TResponse>{ 
     ... 
    } 
} 

消費者は、自分の「アクション」を作成することができ、ので、私は彼らが過負荷を作成できるようにしたいと思います:

// MyFile.ApiLib.ts 
export module ApiLib { 
    export interface TheirRequestInterface { ... } 
    export interface TheirResponseInterface { ... } 

    export function executeAction<TheirRequestInterface, TheirResponseInterface>(actionName: "TheirActionName", data: TheirRequestInterface): Promise<TheirResponseInterface>; 
    export function executeAction<TRequest, TResponse>(actionName: string, data: TRequest): Promise<TResponse>{ 
     ... 
    } 
} 

しかし、明らかに、彼らは変更すべきではありません私のファイル私はその後、タイピングを可能にすること、それらが自分で自分のモジュールを包む見ることができます:

// TheirFile.ApiLib.ts 
import { ApiLib } from "MyFile.ApiLib"; 

export module ApiLibWrapper { 
    export interface TheirRequestInterface { ... } 
    export interface TheirResponseInterface { ... } 

    export function executeAction<TheirRequestInterface, TheirResponseInterface>(actionName: "TheirActionName", data: TheirRequestInterface): Promise<TheirResponseInterface>; 
    export function executeAction<TRequest, TResponse>(actionName: string, data: TRequest): Promise<TResponse>{ 
     return ApiLib.executeAction<TRequest, TResponse>(actionName, data); 
    } 
} 

しかし、これは、ブラウザにダウンロードする必要があり、追加のファイルを意味します。私は彼らが独自の定義を与えるのに "d.ts"ファイルを使うことができると呼んでいましたが、Tsファイルと "d.ts"ファイル、 "d.ts"ファイルの両方を参照しようとすると、 "d.ts"ファイルに定義されているオーバーロード/インタフェースのいずれも持ち込まない:

// TheirFile.ts 
/// <reference path="CustomActionDefinitions.d.ts" /> 
import { ApiLib } from "MyFile.ApiLib"; 

ApiLib.executeAction(/* no overloads from the "d.ts" file shows up here */); 

これは可能ですか?簡単な方法がありますか?

+0

ありますか?これは既存のコードベースですか? –

答えて

1

これは、モジュール(以前は「外部モジュール」と呼ばれていました)によってエクスポートされた名前空間(これまでは「内部モジュール」と呼ばれていました)を拡張することです。次のように

私はそれを宣言します:あなたは、モジュールから名前空間をエクスポートする理由は

// ./MyFile.ApiLib.ts 
export namespace ApiLib { 
    export function executeAction<TRequest, TResponse>(actionName: string, data: TRequest): Promise<TResponse>{ 
     /*...*/ 
    } 
} 

// TheirFile.ts 
import "./MyFile.ApiLib"; 

// This is a module augmentation. 
declare module "./MyFile.ApiLib" { 

    // Within our module augmentation, we are reopening the namespace. 
    export namespace ApiLib { 
     export interface TheirRequestInterface { /*...*/ } 
     export interface TheirResponseInterface { /*...*/ } 

     // We are adding a new overload to 'executeAction'. 
     export function executeAction<TheirRequestInterface, TheirResponseInterface>(actionName: "TheirActionName", data: TheirRequestInterface): Promise<TheirResponseInterface>; 
    } 
} 
+0

しかし、TheirFile.tsはまだd.tsではなくtsファイルなので、ファイルをインポートしなければならないので、別のファイルがブラウザに正しくダウンロードされます。 – Daryl

+0

実行時にインポートが実行されないようにするには、 './MyFile.ApiLib"から 'import {} 'のようなものを書くことができます。 –

+0

私はすべてを名前空間ではなくモジュールとして扱いました。私はどちらかを使用するのか他のものを使うのか分かりません。あなたはあなたが従う親指のルールを持っていますか? – Daryl

関連する問題