You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript返回类型含无意义泛型名问题求助(基于ts-results-es)

TypeScript中ts-results-es库的联合错误类型推断问题

我在使用ts-results-es库时遇到了类型推断问题,这个库的作用是把错误封装到类中,方便明确函数可能抛出的错误类型。

先给出简化后的类定义:

interface BaseResult<T, E> {}

class Err<E> implements BaseResult<never, E> {
    readonly error!: E
    
    constructor(val: E) {
        this.error = val
    }
}

class Ok<T> implements BaseResult<T, never> {
    readonly value!: T

    constructor(val: T) {
        this.value = val
    }
}

type Result<T, E> = Ok<T> | Err<E>

我定义了一个函数randomResult,返回类型是Ok<T> | Err<U> | Err<V>;还有一个函数eatResultFn,它接收一个返回Result<T, E>类型的函数作为参数:

function eatResultFn<T, E>(fn: () => Result<T, E>) {}

现在的核心问题是:TypeScript经常无法自动将randomResult识别为() => Result<T, U | V>,进而抛出类型不兼容的错误。

我首先尝试用Result.mapErr()方法来合并错误类型,这个方法用于将错误映射为另一种类型,相关的接口和类实现如下:

interface BaseResult<T, E> {
    mapErr<F>(mapper: (val: E) => F): Result<T, F>
}

class Err<E> implements BaseResult<never, E> {
    // ... 其他已有代码
    mapErr<E2>(mapper: (err: E) => E2): Err<E2> {
        return new Err(mapper(this.error))
    }
}

class Ok<T> implements BaseResult<T, never> {
    // ... 其他已有代码
    mapErr(_mapper: unknown): Ok<T> {
        return this
    }
}

我使用的映射器只是简单的e => e(准确来说是function (e: U | V) : U | V { return e }),但仍然会收到类似这样的错误:

Argument of type '() => Ok | Err | Err<U | V>' is not assignable to parameter of type '() => Result<T, E2>'

我不清楚错误里的E2是怎么来的,原本以为mapErr能解决类型合并的问题。现在需要一个能消除这个E2、让类型正确推断的方案,或者其他替代解决方法(注意不能直接手动写明精确的返回类型)。

另外一个困惑点是,这段代码有时候又能正常运行,这让问题变得更难排查。

内容的提问来源于stack exchange,提问作者ktnx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 10:50:55