2017-05-30 117 views
2

的时候可以说我有下面的方法“的语句必须用if语句来过滤”tslint抱怨使用开关

(... in)语句必须用if语句过滤

看一看类似的question我不认为这个答案适用于我的情况。在所有switch语句位于if-else-if阶梯的类别之后。

tslint应该考虑switch语句作为if语句的形式,但它不??!

+0

如果使用if else而不是switch? – toskv

+0

如果我有100个条件要检查,你会建议同样的事情吗? – MHOOS

+0

我实际上建议你将内部for循环重构为其他内容。 :)方法调用,或者映射到errors数组以创建错误消息列表。 :) – toskv

回答

5

这让我很好奇,所以我检查了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

1

该规则旨在防止您在使用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工作片段。

+1

我真的很喜欢你重构代码的方式,绝对是一个'谢谢你',并且也是一个投票 – MHOOS