1. ホーム
  2. typescript

[解決済み] TSLintの "文字列リテラルによるオブジェクトアクセス "を回避するためのコードの書き換え方法

2022-03-01 08:32:34

質問

私はTypeScriptの初心者ですが、以下のコードでTSLintエラー "文字列リテラルによるオブジェクトアクセスは許可されません" を回避するためにコードを書き換える良い方法があるかどうか知りたいです。

interface ECType
{
    name: string;
    type: string;
    elementType?: string;
}

export var fields: { [structName: string]: Array<ECType>; } = { };

class ECStruct1 {
    foo: string;
    bar: number;
    baz: boolean;
    qux: number;
    quux: number;
    corge: ECStruct2[];
    grault: ECStruct2;

    constructor() {
        ...
    }
} 

fields['ECStruct1'] = [
    { name: 'foo', type: 'string' },
    { name: 'bar', type: 'int' },
    { name: 'baz', type: 'bool' },
    { name: 'qux', type: 'long' },
    { name: 'quux', type: 'ulong' },
    { name: 'corge', type: 'array', elementType: 'ECStruct2' },
    { name: 'grault', type: 'ECStruct2' }
];

更新情報 : 最後に、上記のコンテンツは、300以上の自己生成ファイルの一部となります。 ECStruct のように、クラス定義(例えば ECStruct1 ) の後に、そのメタディスクリプション (例. fields['ECStruct1'] ).

解決方法は?

ここで、いくつかの選択肢があります。

1) ルールを無効にする

/* tslint:disable:no-string-literal */
whatever.codeHere()
/* tslint:enable:no-string-literal */

2) 文字列リテラルではなく、変数を使用する。

// instead of 
fields['ECStruct1'] = ...
// do something like
let key = 'ECStruct1';
fields[key] = ...

3) 明示的なインターフェイスを書く/生成する

参照 上記のMartylXの回答 . 本来は

interface ECFieldList {
    ECStruct1: ECType[];
}

export var fields:ECFieldList = {
    ECStruct1: [
        ...


しかし、#2はあまり好きではありません。なぜなら、無意味にコードを混乱させてしまうからです。もしコードを生成するのであれば、おそらく fields のように、#3のようにするのが良い解決策です。