type trivially remove literal inferred inferrable from disable annotation typescript tslint

typescript - inferrable - type string trivially inferred from a string literal remove type annotation tslint



Cómo reescribir el código para evitar el acceso de objetos de TSLint a través de literales de cadena (2)

Soy bastante nuevo en TypeScript y me gustaría saber si existe una buena manera de reescribir el código para evitar el error de TSLint "el acceso a objetos a través de los literales de cadena no está permitido" en el siguiente código

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

Actualización : al final, el contenido anterior formará parte de un archivo autogenerado con más de 300 ECStruct s, por lo que me gustaría tener la definición de clase (por ejemplo, ECStruct1 ) seguida de su ECStruct1 (por ejemplo, fields[''ECStruct1''] ).


¿Qué hay de esta manera? No sé si necesita el indexador ( [structName: string]: Array<ECType>; ) o no.

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


Tienes un par de opciones aquí:

Solo desactiva la regla

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

Use una variable en lugar de una cadena literal

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

Escribir / Generar una interfaz explícita

Ver la respuesta de MartylX arriba . Esencialmente:

interface ECFieldList { ECStruct1: ECType[]; } export var fields:ECFieldList = { ECStruct1: [ ...

Cualquiera de estas son soluciones razonables, aunque no soy tan fanático del n. ° 2 porque está arruinando tu código sin una buena razón. Si está generando código de todos modos, quizás generar un tipo de fields como en el # 3 es una buena solución.