web-dev-qa-db-ja.com

TSLint「文字列リテラルを介したオブジェクトアクセス」を回避するためにコードを書き換える方法

私は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を超えるECStructsを含む自己生成ファイルの一部になるため、クラス定義(たとえば、ECStruct1)メタ説明が続きます(例:fields['ECStruct1'])。

47
Denis Cappellin

ここにはいくつかのオプションがあります:

ルールを無効にするだけです

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

文字列リテラルの代わりに変数を使用する

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

明示的なインターフェイスの作成/生成

上記のMartylXの答え を参照してください。基本的に:

interface ECFieldList {
    ECStruct1: ECType[];
}

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

これらはどれも合理的な解決策ですが、正当な理由もなくコードをマングルしているため、私は#2のファンではありません。とにかくコードを生成する場合、おそらく#3のようにfieldsの型を生成するのが良い解決策です。

81
JKillian

ルールを取り除くことができます。探す tslint.json、プロパティの追加"no-string-literal"falseと、rules ::で

{
"rules": {
    "no-string-literal": false,
    ... other rules ...
19
suhailvs

おそらく最良の選択肢ではありませんが、

fields['ECStruct1'.toString()]

うまくいく

5
Vipkry

この方法はどうですか?インデクサーが必要かどうかわかりません([structName: string]: Array<ECType>;) か否か。

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

interface ECFieldList {
    ECStruct1: ECType[];
}

export var fields:ECFieldList = {
    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'}
    ]
};
3
Martin Vseticka

テンプレートリテラルアノテーションを使用するだけです。

fields[`ECStruct1`]
2
nyc_coder

簡単な方法は、ECStruct1の値を保持する変数を定義することです。

const sampleName = 'ECStruct1';

次に、変数をインデックスとして使用してオブジェクトにアクセスします。

fields[sampleName] ...
0
Alex Trn