-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();
    }
}

这是您可以粘贴到Playground中尝试的完整示例:

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 回答