Подтвердить что ты не робот

Как переписать код, чтобы избежать доступа к объекту 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']).

4b9b3361

Ответ 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']