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

时间:2017-08-08 08:57:17

标签: typescript

我希望两个实现具有相同的函数名称,具体取决于参数的类型(或赋予函数的通用类型)。

这背后的主要目标是能够在序列化程序上使用deserialize方法,以便能够反序列化对象和数组,而不是deserializedeserializeArray。< / 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:实现只是示例,它不会像以后那样实现。

1 个答案:

答案 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;
}

code in playground

实际的实现签名需要匹配所有其他签名,否则编译器会抱怨 您可以在此处详细了解:Functions > Overloads