저는 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] ...