2016-08-10 3 views
0

次のコードでは、TypeScriptダックタイピング:1つのプロパティのみを要求する

interface ParamTest extends Object { 
    ids?: any; 
    model?: any; 
    params?: any; 
    pageContext?: PageContext; 
} 

class Foo { 
    public callMeWithParamsPlease(params: ParamTest): void{ 

    } 

    public nope() { 
     this.callMeWithParamsPlease("hi"); 
    } 
} 

私はパラメータとして何が提供されるのかわかりません。しかし、私は、少なくとも1つはのフィールドを埋める必要があることを知っています。私が使用している場合:

export interface ApiServiceOpts extends Object { 
    ids?: any; 
    model?: any; 
    params?: any; 
    pageContext: PageContext; 
} 

予想通りその後、それは、もはや文字列と互換性がありません - 文字列がpageContextを持っていないため。しかし、私はpageContextが供給されるかどうかはわかりませんが、少なくとも1つのフィールドを提供する必要があることはわかっています。これを可能にする魔法のタイコスクリプト構文はありますか?

多分次のようなものです。

interface PageContext {} 


export interface ParamTestId { 
    ids: any; 
} 

export interface ParamTestModel { 
    model: any; 
} 

export interface ParamTestParams { 
    params: any; 
} 

export interface ParamTestPageContext { 
    pageContext: PageContext; 
} 

class Foo { 
    public callMeWithParamsPlease(params: ParamTestId & ParamTestModel & ParamTestParams & ParamTestPageContext): void { 
     params.ids.a = ""; 
     params.model.b = {} 
    } 

    public nope() { 
     this.callMeWithParamsPlease("hi") 
    } 
} 
+0

それはあなたが求めているものは明らかではありません。 ''それはもはや文字列 ''と互換性がなくなりました - いつ文字列と互換性があったのでしょうか、これは何ですか?あなたのコードのどこに文字列パラメータがあるのですか?また、なぜ 'Object'を拡張しますか? –

答えて

0

は、私は次のことを示唆している:

  • は何も追加しませんObjectを拡張し、あなたのインターフェイスは、すでにオブジェクトです。それを取り除く。
  • stringObjectですが、あなたはそれに頼るべきではありません、代わりに使用すると、オブジェクトや文字列を受け入れることを明示的に示すために、タイプ組合を使用し、で、すなわち

    callMe(params:ParamTest|string) { 
        // params may be a string now regardless of ParamTest's definition. 
    } 
    
  • ので、あなたのタイプはstringと互換性でしたこの時点あなたはつまり、あなたが実際のparamsに入ったかどうか確認するためにタイプのガードを使用する必要があります。

    interface ParamTest { 
        ids:string[]; 
        paramContext:string; 
    } 
    class Foo { 
        callMeMaybe(params:ParamTest|string) { 
        if (params instanceof String) { 
         // Cool it's a string. 
         let x = params.charCodeAt(0); 
        } else { 
         let m = params.ids; 
        } 
        } 
    } 
    
+0

あなたがその質問を理解しているかどうか分かりません。 'ParamTest'は' string'型と互換性があります。関数が明示的に 'ParamTest'を受け入れても、すべてのプロパティがオプションであるため、文字列を渡すことができます。 – David

関連する問題