使用switch时,tslint抱怨"语句必须使用if语句进行过滤"

MHO*_*OOS 21 typescript tslint angular-cli angular

可以说我有以下方法:

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;
}
Run Code Online (Sandbox Code Playgroud)

我跑的时候

ng lint
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

for(... in ...)语句必须使用if语句进行过滤

看一下类似的问题,我认为答案不适用于我的情况.所有switch语句都在if-else-if阶段的类别中.

tslint应该将switch语句视为if语句的形式,但它没有?!

Fra*_*ica 25

这让我很好奇,所以我检查了这条规则的TSlint源代码.它有一个叫做的函数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);
    }

}
Run Code Online (Sandbox Code Playgroud)

因此,除非您想将对象转换为数组,否则您需要使用您提供的链接中的修复.要么Object.keysif声明,要么声明:

    for (const errorName in state.errors) {
      if (state.errors.hasOwnProperty(errorName)) {
        switch (errorName) {
Run Code Online (Sandbox Code Playgroud)

有趣的是,你可以有任何if声明,错误就会消失.没有检查你是否在打电话hasOwnProperty.


tos*_*skv 8

该规则旨在防止您在中使用..中时访问对象原型上定义的属性。

但是,您可以重构代码以使其不使用它,并使维护和开发也更容易。

一个例子是这样的:

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 [];
}
Run Code Online (Sandbox Code Playgroud)

您可以在此处的操场上看到一个正在运行的代码段。