[typescript] 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 ECStruct초가 넘는 자체 생성 파일의 일부가 될 것이므로 클래스 정의 (예 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의 팬은 아니지만 이들 중 어느 것도 합리적인 솔루션입니다. 어쨌든 코드를 생성하는 경우 fields# 3에서와 같이 유형을 생성 하는 것이 좋은 해결책 일 수 있습니다.


답변

규칙을 없앨 수 있습니다. 를 찾아 tslint.json속성을 추가, "no-string-literal"false에, rules::

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


답변

템플릿 리터럴 주석을 사용하십시오.

fields[`ECStruct1`]


답변

이 방법은 어떻습니까? 인덱서 ( [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'.toString()]

너무 작동합니다


답변

간단한 방법은 ECStruct1의 값을 보유 할 변수를 정의하는 것입니다.

const sampleName = 'ECStruct1';

그런 다음 변수를 인덱스로 사용하여 개체에 액세스합니다.

fields[sampleName] ...


답변