Как переписать код, чтобы избежать доступа к объекту 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
s, поэтому я хотел бы иметь определение класса (например, ECStruct1
), за которым следует его мета-описание (например, fields['ECStruct1']
).
Ответы
Ответ 1
У вас есть пара вариантов:
Просто отключите правило
/* 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, является хорошим решением.
Ответ 2
Вы можете избавиться от правила. Найдите tslint.json
, добавьте свойство "no-string-literal"
со значением false
в rules
::
{
"rules": {
"no-string-literal": false,
... other rules ...
Ответ 3
Как насчет этого? Я не знаю, нужен ли вам индекс ([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'}
]
};
Ответ 4
Вероятно, не самый лучший вариант, но с использованием
fields['ECStruct1'.toString()]
тоже работает
Ответ 5
Просто используйте шаблон буквенной аннотации.
fields['ECStruct1']