在视频中我发现接口可以使用奇怪的过载技术。下面的代码已编译但不起作用。 我有一些问题,所有问题都放在代码中:
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);
答案 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));