我希望两个实现具有相同的函数名称,具体取决于参数的类型(或赋予函数的通用类型)。
这背后的主要目标是能够在序列化程序上使用deserialize
方法,以便能够反序列化对象和数组,而不是deserialize
和deserializeArray
。< / p>
以下是我想要做的一个例子:
export type Abstract<T = any> = Function & { prototype: T };
export type Instantiable<T = any> = new (...args: any[]) => T;
export type Class<T = any> = Abstract<T> | Instantiable<T>;
function deserialize<T>(obj: any, clazz: Class<T>): T{
return obj as T;
}
function deserialize<T extends any[]>(obj: any[], clazz: Class<T>): T{
let array:T = [];
for (let data of obj) {
array.push(data as T);
}
return array;
}
See it on typescript playground
但问题是,我无法弄清楚如何创建两个签名而不会出现打字稿错误,而且,我也无法找到如何&#34;给予&#34; Class<T>
Foo[]
Foo[]
,因为Array<Foo>
和SELECT
都无法工作。
N.B:实现只是示例,它不会像以后那样实现。
答案 0 :(得分:3)
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;
}
实际的实现签名需要匹配所有其他签名,否则编译器会抱怨 您可以在此处详细了解:Functions > Overloads