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.