Typescript-具有条件返回类型的函数中的返回特定类型

时间:2020-09-17 02:27:22

标签: typescript typescript-generics

为什么此代码不起作用?具体来说,为什么联合类型不能分配给条件类型?

编辑:尽管很清楚为什么不能将联合类型分配给条件类型,但是在理论上应该有一个类型保障,即应该保证正确的返回类型。

class A { }
class B { }

function f<T extends A | B>(x: T): T extends A ? A : B {
    if (x instanceof A) {
        return x;
    }
    return x;
}

Example 1

Example 2

Example 3

这可以使用函数重载来解决,但在我的情况下不方便:f的签名又大又复杂,我不想在每个重载中都重复它。

1 个答案:

答案 0 :(得分:0)

class A { t: "A" }
class EA extends A { et: "EA" }
class B { t: "B" }
class C { t: "C" }

function f<T extends A | B>(x: T extends A ? A : B): T extends A ? A : B {
    if (x instanceof A) {
        return x;
    }
    return x;
    
}
f<A>(new A())//return A
f<EA>(new EA())//return A
f<B>(new B())//return B
f<C>(new C())//TYPE ERROR

泛型T扩展了接口,而不是类。