的时候可以说我有下面的方法“的语句必须用if语句来过滤”tslint抱怨使用开关
(... in)语句必须用if语句过滤
看一看类似的question我不认为这个答案适用于我的情况。在所有switch语句位于if-else-if阶梯的类别之后。
tslint应该考虑switch语句作为if语句的形式,但它不??!
的时候可以说我有下面的方法“的语句必须用if语句来过滤”tslint抱怨使用开关
(... in)语句必须用if语句过滤
看一看类似的question我不认为这个答案适用于我的情况。在所有switch语句位于if-else-if阶梯的类别之后。
tslint应该考虑switch语句作为if语句的形式,但它不??!
这让我很好奇,所以我检查了TSlint source code这个规则。它有一个称为isFiltered
的功能,似乎只检查ts.SyntaxKind.IfStatement
,而不是ts.SyntaxKind.SwitchStatement
。
function isFiltered({statements}: ts.Block): boolean {
switch (statements.length) {
case 0: return true;
case 1: return statements[0].kind === ts.SyntaxKind.IfStatement;
default:
return statements[0].kind === ts.SyntaxKind.IfStatement && nodeIsContinue((statements[0] as ts.IfStatement).thenStatement);
}
}
因此,除非您想将对象转换为数组,否则您需要使用您提供的链接中的修复。无论是Object.keys
,或if
声明:
for (const errorName in state.errors) {
if (state.errors.hasOwnProperty(errorName)) {
switch (errorName) {
有趣的是,你可以有什么样的if
语句和错误会自行消失。没有检查,看看你是否打电话给hasOwnProperty
。
该规则旨在防止您在使用for ..时在中访问在对象原型上定义的属性。
然而,您可以重构代码以便不使用它,并且使其更易于维护和开发。
一个例子是这样的:
interface ErrorMessageFactory {
(thing: string, state?): string
}
type Errors = 'required' | 'minlength' | 'pattern' | 'validateCardNumberWithAlgo'
let errorFactory: {[e in Errors]: ErrorMessageFactory} = {
required: (thing) => `You must enter a ${thing}`,
minlength: (thing, state) => `A ${thing} must be at least ${state.errors['minlength'].requiredLength}characters`,
pattern: (thing) => `The ${thing} contains illegal characters`,
validateCardNumberWithAlgo: (thing) => `Card doesnt pass algo`
}
function getErrorMessage(state: any, thingName?: string) {
if (state.errors) {
return state.errors.map((error) => errorFactory[error](thingName, state));
}
return [];
}
您可以在操场上看到here工作片段。
我真的很喜欢你重构代码的方式,绝对是一个'谢谢你',并且也是一个投票 – MHOOS
如果使用if else而不是switch? – toskv
如果我有100个条件要检查,你会建议同样的事情吗? – MHOOS
我实际上建议你将内部for循环重构为其他内容。 :)方法调用,或者映射到errors数组以创建错误消息列表。 :) – toskv