当typeguard和Exclude组合在一起时,为什么Typescript变量不能正确地推断其类型?

vmpqdwk3  于 2023-02-20  发布在  TypeScript
关注(0)|答案(1)|浏览(86)

我有这个代码片段,但是return arg行有编译错误

type Foo<T> = T | Error

type Successful<A> = Exclude<A, Error>

const fn = <S>(arg: Foo<S>): Successful<Foo<S>> => {
    if (arg instanceof Error) {
        throw new Error()
    }
    return arg
}

Type 'S' is not assignable to type 'Exclude<S, Error>'.(2322)
为什么编译器不能理解arg应该是S类型,只有在保护以缩小类型范围之后?
示范操场

63lcw9qa

63lcw9qa1#

Typescript编译器不能理解arg应该是条件后的成功类型。如果TS能自动理解就好了。但这是他工作的细节
使用类型Assert

type Foo<T> = T | Error

type Successful<A> = Exclude<A, Error>

const fn = <S>(arg: Foo<S>): Successful<Foo<S>> => {
    if (arg instanceof Error) {
        throw new Error()
    }
    return arg as Successful<Foo<S>>
}

相关问题