当我使用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)、 这是另一件事,我不知道为什么.

推荐答案

这是打字中的一个错误.像E2这样的Generic个类型参数不应该能够"逃离"它们的作用域,并在代码的其余部分自由漫游.我已经提交了microsoft/TypeScript#57356,它已经被归类为错误,至少到今天(2024-02-10)它已经被标记为应该在TypeScrip5.5中修复的东西.有时这些时间线会溜走,所以我们必须拭目以待.如果有更新,我会编辑这个答案.在此之前,您将需要解决这个问题,可能是通过注释实际需要的类型,尽管这不是您想要做的.

Typescript相关问答推荐

在Switch陈述中输入保护类

如何使用TypScript和react-hook-form在Next.js 14中创建通用表单组件?

如何将绑定到实例的类方法复制到类型脚本中的普通对象?

从接口创建类型安全的嵌套 struct

带有联合参数的静态大小数组

不推荐使用Marker类-Google map API警告

使用动态主体初始化变量

返回具有递归属性的泛型类型的泛型函数

表单嵌套太深

Angular 15使用react 式表单在数组内部创建动态表单数组

如何实现异构数组内函数的类型缩小

如何在Typescript 中组合unions ?

在保留类型的同时进行深层键名转换

不带其他属性的精确函数返回类型

类型与泛型抽象类中的类型不可比较

如何编辑切片器以使用CRUD调用函数?

我不明白使用打字脚本在模板中展开参考

映射类型不是数组类型

如何在Vue动态类的上下文中解释错误TS2345?

Angular另一个组件的nativeelement未定义