typescript - Hvordan omskrive kode for å unngå TSLint «objekttilgang via strengliteraler»


Jeg er ganske ny med TypeScript og jeg vil gjerne vite om det finnes en god måte å omskrive kode på for å unngå TSLint-feilen "objekttilgang via streng-litteraler er ikke tillatt" i følgende kode

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' }
];

Oppdatering: Til slutt vil innholdet ovenfor bli en del av en selvgenerert fil med mer enn 300 ECStruct-er, så jeg vil gjerne ha klassedefinisjonen (f.eks. ECStruct1) etterfulgt av dens meta-beskrivelse (f.eks. fields['ECStruct1']).

Svar #1

Du har et par alternativer her:

1) Bare deaktiver regelen

/* tslint:disable:no-string-literal */
whatever.codeHere()
/* tslint:enable:no-string-literal */

2) Bruk en variabel i stedet for en strengliteral

// instead of 
fields['ECStruct1'] = ...
// do something like
let key = 'ECStruct1';
fields[key] = ...

3) Skriv/Generer et eksplisitt grensesnitt

Se MartylXs svar ovenfor. I hovedsak:

interface ECFieldList {
    ECStruct1: ECType[];
}

export var fields:ECFieldList = {
    ECStruct1: [
        ...

Hvilken som helst av disse er rimelige løsninger, selv om jeg ikke er så stor fan av #2 fordi det ødelegger koden din uten noen god grunn. Hvis du uansett genererer kode, kan det å generere en type for fields som i #3 være en god løsning.

Svar #2

Du kan kvitte deg med regelen. Se etter tslint.json, og legg deretter til en egenskap "no-string-literal" med false i rules:

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

Svar #3

Bare bruk mal-literal merknad.

fields[`ECStruct1`]

Relaterte artikler