【问题标题】:What to do when I need to use `any` in typescript generics?当我需要在 typescript 泛型中使用 `any` 时该怎么办?
【发布时间】:2020-07-20 22:09:31
【问题描述】:

我为我的所有服务响应编写了一个包装器,如下所示:

export type Response<T> {
  status: 'success' : 'failed';
  data?: T;
  error?: Error;
}

我的所有服务都会返回,successdata 的值或 failederror 的值

我尝试编写一个实用函数,它会在出现错误时为我构建一个Response,它看起来像这样:

private handleError(error: Error): Response<any> {
  if (error && isSomeSpecificError(error.message)) {
    return { status: 'failed', error: SpecificError(error) };
  }
  return { status: 'failed', error };
}

它工作正常,但 ESLint 抱怨 any 并带有以下消息:

ESLint:出乎意料。指定不同的类型。(@typescript-eslint/no-explicit-any)

如果我使用unknown,那么任何返回调用此函数结果的函数都会失败,因为它有不同的T

有没有办法解决这个问题?或者这是我应该忽略 eslint 找到另一种解决方案的情况之一?

【问题讨论】:

    标签: typescript eslint


    【解决方案1】:

    我就是这样做的:

    interface Success<T> {
        status: 'success';
        data: T
    }
    
    interface Failure {
        status: 'failed'
        error: Error;
    }
    
    export type Response<T> = Success<T> | Failure;
    
    class Something {
        handleError(error: Error): Failure {
            if (error && error.message) {
                return { status: 'failed', error: new Error };
            }
    
            return { status: 'failed', error };
        }
    }
    

    一般来说,您不想在可以使用联合的地方使用可选字段。这使得无效状态无法表示(例如,{ status: 'success', error: new Error } 不应该发生,但使用可选字段的方法允许它)。

    从头开始构建时,联合更有用。在这里,我们可以使用Failure 的定义来准确说明将返回的内容。

    【讨论】:

    • 在这种情况下,它甚至可能不需要status 字段。
    猜你喜欢
    • 1970-01-01
    • 2013-11-14
    • 2011-02-10
    • 1970-01-01
    • 2020-12-12
    • 1970-01-01
    • 2012-10-26
    • 1970-01-01
    相关资源
    最近更新 更多