的時候可以說我有下面的方法「的語句必須用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