TypeScript根据类型参数返回不同的类型

时间:2019-07-27 16:11:44

标签: typescript typescript-typings

我有一个函数myFunc<T1, T2 = undefined>,如果还有[T1],则返回T2 extends undefined,否则返回[T1, T2]。不用// @ts-ignore就能实现这样的功能吗?

function myFunc<T1, T2 = undefined>(t1: T1, t2?: T2): T2 extends undefined ? [T1] : [T1, T2] {
    if (t2 === undefined) {
        return [t1];
    }

    return [t1, t2];
}

此语法在每个return语句中给我一个TypeScript错误,表示该值不可分配给T2 extends undefined ? [T1] : [T1, T2]

1 个答案:

答案 0 :(得分:1)

条件类型通常会在实现中引起问题。除了完全相同的条件类型以外,您不能为仍然具有未解析类型参数的条件类型分配任何内容。因此,打字稿不允许您将[T1][T1, T2]分配给返回值。

您可以使用类型断言,也可以使用单独的实现签名,该签名返回一个并集。我个人更喜欢第二种选择:

function myFunc<T1, T2 = undefined>(t1: T1, t2?: T2): T2 extends undefined ? [T1] : [T1, T2]
function myFunc<T1, T2 = undefined>(t1: T1, t2?: T2): [T1] | [T1, T2] {
    if (t2 === undefined) {
        return [t1];
    }

    return [t1, t2];
}