TypeScript - איך לכתוב מחדש קוד כדי להימנע מ-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, לכן אני מעוניין שיהיה הגדרת המחלקה (למשל ECStruct1) ואחריה התיאור המטא שלה (למשל fields['ECStruct1']).

תשובה #1

יש לך כמה אפשרויות כאן:

1) פשוט השבת את הכלל

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

2) השתמש במשתנה במקום במחרוזת מילולית

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

3) כתוב/צור ממשק מפורש

ראו את התשובה של 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

פשוט השתמש בהערת תבנית מילולית.

fields[`ECStruct1`]