2017-05-30 114 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