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
相关产品推荐
相关产品推荐

