次の方法があるとしましょう:
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ステートメントでフィルターする必要があります
同様の question を見てみると、その答えは私の状況に当てはまるとは思いません。すべてのswitchステートメントは、if-else-ifラダーのカテゴリに属します。
tslintは、switchステートメントをifステートメントの形式と見なすべきですが、そうではありません!?
これは私を不思議に思わせたので、このルールの 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);
}
}
そのため、オブジェクトを配列に変換する場合を除き、指定したリンクの修正を使用する必要があります。 Object.keys
またはif
ステートメントのいずれか:
for (const errorName in state.errors) {
if (state.errors.hasOwnProperty(errorName)) {
switch (errorName) {
興味深いのは、あらゆる種類のif
ステートメントを使用でき、エラーがなくなることです。 hasOwnProperty
を呼び出しているかどうかを確認するチェックはありません。
このルールは、for .. inを使用するときに、オブジェクトプロトタイプで定義されたプロパティにアクセスできないようにすることを目的としています。
ただし、それを使用しないようにコードをリファクタリングし、同様に保守および開発を容易にすることができます。
例は次のとおりです。
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 。