"TS7030: Not all code paths return a value" 与 ESLint "no-undefined" 和 "no-useless return" 冲突解决

"TS7030: Not all code paths return a value" vs. ESLint "no-undefined" and "no-useless return" conflict resolving

目标

我明白 ESLint 不是唯一的事实来源,而且可以反向定制,但在这个问题中我想要以下结果之一:

冲突描述

以下代码有效且有效,但我有 no-undefined ESLint 规则违规:

@Component
export default class MyComponent extends Vue {

  public static getInstanceByReference(
    vueReference: Vue | Element | Array<Vue> | Array<Element>
  ): MyComponent | undefined {
    if (vueReference instanceof MyComponent) {
      return vueReference;
    }
    return undefined;
  }
}

如果我们从return undefined中删除undefined,将会no-useless-return违反规则:

@Component
export default class MyComponent extends Vue {

  public static getInstanceByReference(
    vueReference: Vue | Element | Array<Vue> | Array<Element>
  ): MyComponent | undefined {
    if (vueReference instanceof MyComponent) {
      return vueReference;
    }
    return;
  }
}

如果我们从上次JavaScript的角度return完全return没用return,就会出现TypeScript错误:

TS7030: Not all code paths return a value.
@Component
export default class MyComponent extends Vue {

  public static getInstanceByReference(
    vueReference: Vue | Element | Array<Vue> | Array<Element>
  ): MyComponent | undefined {
    if (vueReference instanceof MyComponent) {
      return vueReference;
    }
  }
}

如果我们将 return 值签名更改为 MyComponent | void,我们将得到 no-invalid-void-type rule violation of @typescript-eslint.

我要问的问题是“您的代码的目标是什么?”

如果目标是发出 error/nothing 状态信号 - 那么“无效”值正是您想要的。 鉴于您的 lint 配置(无论出于何种原因)禁止 undefined 值,那么为什么不直接使用 null?

 public static getInstanceByReference(
    vueReference: Vue | Element | Array<Vue> | Array<Element>
  ): MyComponent | null {
    if (vueReference instanceof MyComponent) {
      return vueReference;
    }
    return null;
  }

如果您真的想要undefined值而不明确引用undefined,那么根据no-undefined docs,您可以只使用void 运算符:

 public static getInstanceByReference(
    vueReference: Vue | Element | Array<Vue> | Array<Element>
  ): MyComponent | undefined {
    if (vueReference instanceof MyComponent) {
      return vueReference;
    }
    return void 0;
  }

顺便说一句。

If we change the return value signature to MyComponent | void, we get the no-invalid-void-type rule violation of @typescript-eslint.

void 不应在联合类型中使用。说“这个函数 return 是什么东西或者 return 什么都不是”是一种非常荒谬的类型。它与事物相矛盾并导致 TS 的行为有些违反直觉(即像禁用丢失的 return 语句检查)。

这就是 no-invalid-void-type 规则报告 MyComponent | void 的原因,这无疑是您的 lint 配置启用规则的原因。