首页 > 解决方案 > Typescript - 在具有条件返回类型的函数中返回特定类型

问题描述

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

编辑:虽然很清楚为什么联合类型不能分配给条件类型,但这里有一种类型保护,理论上应该保证正确的返回类型。

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

示例 1

示例 2

示例 3

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

标签: typescripttypescript-generics

解决方案


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 扩展接口而不是类。


推荐阅读