当我使用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>
,我还有一个函数,它把一个返回结果的函数作为输入function eatResultFn<T, E>(fn: () => Result<T, E>) {}
.
有时,TypeScrip不会将randomResult
识别为() => Result<T, U | V>
并抛出错误.这才是我想要解决的真正问题.
我的第一个 idea 是用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<T> | Err<E2> | Err<U | V>' is not assignable to parameter of type '() => Result<T, E2>'.
一百!
我不知道为什么这里有E2
场演出,我希望mapErr
场就能解决我的问题.
任何解决方案,以摆脱E2
或任何解决办法(除了直接编写确切的返回类型),我的原始问题.
感谢您的帮助:)
请注意,代码sometimes工作正常(请参见 Typescript Playground)、 这是另一件事,我不知道为什么.