Angular tslint“抱怨”;必须使用if语句“过滤语句”;使用开关时

Angular tslint“抱怨”;必须使用if语句“过滤语句”;使用开关时,angular,typescript,angular-cli,tslint,Angular,Typescript,Angular Cli,Tslint,假设我有以下方法: getErrorMessage(state: any, thingName?: string) { const thing: string = state.path || thingName; const messages: string[] = []; if (state.errors) { for (const errorName in state.errors) { switch (errorName) {

假设我有以下方法:

getErrorMessage(state: any, thingName?: string) {
    const thing: string = state.path || thingName;
    const messages: string[] = [];
    if (state.errors) {
        for (const errorName in state.errors) {
            switch (errorName) {
                case 'required':
                    messages.push(`You must enter a ${thing}`);
                    break;
                case 'minlength':
                    messages.push(`A ${thing} must be at least ${state.errors['minlength'].requiredLength}characters`);
                    break;
                case 'pattern':
                    messages.push(`The ${thing} contains illegal characters`);
                    break;
                case 'validateCardNumberWithAlgo':
                    messages.push(`Card doesnt pass algo`);
                    break;
            }
        }
    }
    return messages;
}
当我跑的时候

ng lint
我得到以下错误:

for(…in…)语句必须使用if语句进行筛选

看看类似的情况,我不认为这个答案适用于我的情况。毕竟switch语句属于if-else-if梯形图的类别


TSLILT应将转换语句看作IF语句的形式,但它不?? 这让我很好奇,所以我检查了这个规则。它有一个名为

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时访问对象原型上定义的属性。。在

但是,您可以重构代码,使其不再使用,并使其更易于维护和开发

例如:

接口错误消息工厂{
(事物:字符串,状态?):字符串
}
类型错误='required'|'minlength'|'pattern'|'ValidateCardNumber WithAlgo'
让errorFactory:{[e in Errors]:ErrorMessageFactory}={
必需:(thing)=>`您必须输入${thing}`,
minlength:(thing,state)=>`A${thing}必须至少为${state.errors['minlength'].requiredLength}个字符`,
pattern:(thing)=>`The${thing}包含非法字符`,
validateCardNumberWithAlgo:(thing)=>`卡不通过algo`
}
函数getErrorMessage(状态:any,thingName?:string){
if(state.errors){
返回state.errors.map((error)=>errorFactory[error](thingName,state));
}
返回[];
}

你可以在操场上看到一个工作片段。

使用if-else而不是switch?如果我有100个条件要检查,你会建议同样的事情吗?我实际上会建议你将内部for循环重构为其他内容。:)方法调用,或者映射到错误数组以创建错误消息列表。:)@toskv的可能重复我认为重点是规则规定,
if
语句应该在
中的
for…之后,switch语句可以看作是一种
if
语句,但它不能解决错误。