-3

ビデオでは、インターフェイスが奇妙なオーバーロード手法を使用できることがわかりました。以下のコードはコンパイルされていますが、機能しません。いくつか質問がありますが、それらはすべてコード内に配置されています。

interface X{

// how can the class implements such overload ?
    f:{ 
        (s:string):string;
        (s:number):string;
        data:any;
    };
}

class xxx
{

// how to initialize this structure ?
    f:{   
        (s:string):string;
        (s:number):string;
        data:any;
    };
}


var x = new xxx();

// how should the class xxxx look to be used with this function ?
function a(x:X):string{
    return x.f("1");    
}

a(x);
4

2 に答える 2

3

f文字列または数値のいずれかを使用して関数を呼び出そうとしていると思います。

インターフェイスでは、次のようにオーバーロードを定義します。

interface X{
    b(s:string) : string;

    f (s:string):string;
    f (s:number):string;
}

そして、このようなインターフェースを実装します。

class xxx implements X
{
    b(s:string) : string
    {
        return "";      
    }

    f (s: string): string;
    f (s: number) : string;
    f (s: any) : string {
        return s.toString();
    }
}

プレイグラウンドに貼り付けて試すことができる完全な例を次に示します。

interface X {
    b(s:string) : string;
    f (s:string):string;
    f (s:number):string;
}

class xxx implements X {
    b(s:string) : string {
        return "";      
    }

    f (s: string): string;
    f (s: number) : string;
    f (s: any) : string {
        return s.toString();
    }
}

var x = new xxx();

alert(x.f("1"));
alert(x.f(5));
于 2012-10-30T10:35:56.607 に答える
1

私が見つけた唯一の解決策は、型キャストを使用することです。それは動作しますが、かなり醜いように見えます。私にとって、これはコンパイラのエラーであるか、これを行う別の方法があるはずです。

UPD:確かに、これが唯一の解決策です、http://typescript.codeplex.com/discussions/401235

interface X{
    f:{ 
        (s:string):string; 
        (s:number):string; 
        data:any; 
    };
}

class xxx
{
    constructor()
    {
        this.f = <{ (s:string):string; (s:number):string; data:any; }> function (s:any):string {return s.toString();};
        this.f.data = "data" 
    };

    f:{ 
        (s:string):string;
        (s:number):string;
        data:any;
    };
}


var x = new xxx();

function a(x:X):string{
    return  x.f("1") + x.f(1) + x.f.data;     
}

alert(a(x));
于 2012-10-30T14:17:50.130 に答える