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`]
