1. ホーム
  2. angular

[解決済み] switchの使用時に「ステートメントはif文でフィルタリングされなければならない」というtslintのクレームが発生する。

2022-02-14 23:01:17

質問事項

次のようなメソッドがあるとします。

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のラダーのカテゴリに位置します。

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 .