重载实现

时间:2012-10-30 10:18:36

标签: typescript

在视频中我发现接口可以使用奇怪的过载技术。下面的代码已编译但不起作用。 我有一些问题,所有问题都放在代码中:

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

2 个答案:

答案 0 :(得分: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));

答案 1 :(得分: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));