私は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
sを含む自己生成ファイルの一部になるため、クラス定義(たとえば、ECStruct1
)メタ説明が続きます(例:fields['ECStruct1']
)。
ここにはいくつかのオプションがあります:
ルールを無効にするだけです
/* 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
の型を生成するのが良い解決策です。
ルールを取り除くことができます。探す tslint.json
、プロパティの追加"no-string-literal"
でfalse
と、rules
::で
{
"rules": {
"no-string-literal": false,
... other rules ...
おそらく最良の選択肢ではありませんが、
fields['ECStruct1'.toString()]
うまくいく
この方法はどうですか?インデクサーが必要かどうかわかりません([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'}
]
};
テンプレートリテラルアノテーションを使用するだけです。
fields[`ECStruct1`]
簡単な方法は、ECStruct1の値を保持する変数を定義することです。
const sampleName = 'ECStruct1';
次に、変数をインデックスとして使用してオブジェクトにアクセスします。
fields[sampleName] ...