具有通用多个调用签名的TypeScript接口

时间:2018-08-09 12:11:28

标签: typescript

我想在一个接口中具有多个呼叫签名,以便它们具有不同的通用参数

interface GenericIdentityFn {
    <T>(arg: T): T;
    <T, F>(arg1: T, arg2: F): [T, F];
}

function identity<T>(arg: T): T {
    return arg;
}

// error: duplicate definition
function identity<T, F>(arg1: T, arg2: F): [T, F] {
    return [arg1, arg2];
}

let myIdentity: GenericIdentityFn = identity;

console.log(myIdentity("hello"));

1 个答案:

答案 0 :(得分:3)

一个函数不能有多个实现。您可以有一个具有多个签名的函数,但是可以有一个实现,在实现中由您自己确定被调用的签名。

如果您定义具有多个重载的函数,则可以将其分配给GenericIdentityFn接口

interface GenericIdentityFn {
    <T>(arg: T): T;
    <T, F>(arg1: T, arg2: F): [T, F];
}

function identity<T>(arg: T): T;
function identity<T, F>(arg1: T, arg2: F): [T, F]
function identity<T, F>(arg1: T, arg2?: F): T | [T, F] {
    return typeof arg2 === 'undefined' ? arg1 : [arg1, arg2];
}

let myIdentity: GenericIdentityFn = identity;

console.log(myIdentity("hello"));