"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 不是唯一的事实来源,而且可以反向定制,但在这个问题中我想要以下结果之一:
- 遵守所有提到的规则解决冲突
- 有人说“在这种情况下你可以安全地禁用 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 配置启用规则的原因。
目标
我明白 ESLint 不是唯一的事实来源,而且可以反向定制,但在这个问题中我想要以下结果之一:
- 遵守所有提到的规则解决冲突
- 有人说“在这种情况下你可以安全地禁用 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 配置启用规则的原因。