Typescript 数组和对象类型的不同签名

Typescript 数组和对象类型的不同签名,typescript,Typescript,根据参数的类型(或函数的泛型类型),我希望两个实现具有相同的函数名 这背后的主要目标是能够在序列化程序上使用反序列化方法来反序列化对象和数组,而不是使用反序列化和反序列化数组 下面是我想做的一个例子: export-type-Abstract=Function&{prototype:T}; 导出类型Instantiable=new(…args:any[])=>T; 导出类型类=抽象|可实例化; 函数反序列化(obj:any,clazz:Class):T{ 将obj返回为T; } 函数反序列化(o

根据参数的类型(或函数的泛型类型),我希望两个实现具有相同的函数名

这背后的主要目标是能够在序列化程序上使用
反序列化
方法来反序列化对象和数组,而不是使用
反序列化
反序列化数组

下面是我想做的一个例子:

export-type-Abstract=Function&{prototype:T};
导出类型Instantiable=new(…args:any[])=>T;
导出类型类=抽象|可实例化;
函数反序列化(obj:any,clazz:Class):T{
将obj返回为T;
}
函数反序列化(obj:any[],clazz:Class):T{
let数组:T=[];
for(obj的let数据){
array.push(数据为T);
}
返回数组;
}

但问题是,我无法找出如何创建这两个签名而不出现typescript错误,而且,我也无法找到如何“给出”
Foo[]
类,因为
Foo[]
Array
都不起作用


注意:实现只是示例,以后不会这样实现。

Javascript不支持重载,这就是为什么不能对两个不同的函数使用相同的名称。
Typescript只支持签名重载,也就是说,只有一个实现,但您为此实现声明了多个签名

在您的情况下,类似这样的情况:

function deserialize<T>(obj: any, clazz: Class<T>): T;
function deserialize<T extends any[]>(obj: any[], clazz: Class<T>): T;
function deserialize<T>(obj: any, clazz: Class<T>): T {
    return obj as T;
}
函数反序列化(obj:any,clazz:Class):T;
函数反序列化(obj:any[],clazz:Class):T;
函数反序列化(obj:any,clazz:Class):T{
将obj返回为T;
}
()

实际实现签名需要与所有其他签名匹配,否则编译器会抱怨。

您可以在这里阅读更多信息:

好的,我必须声明多个签名,并自己对obj类型进行筛选(数组还是非数组)?完全正确。这并不漂亮,但这是由于javascript的限制。