Класс с неопределенными свойствами - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь создать класс, который будет накапливать значения для строк и столбцов, каждая строка / столбец идентифицируется строкой.Я надеюсь, что код будет достаточно иллюстративным:

class TMatrix<TYPE>{

    [idRow: string]: { [idCol: string]: TYPE };

    fnset(nmRow: string, nmCol: string, value: TYPE ) {
      if (!this[nmRow]) 
          this[nmRow] = {};
      this[nmRow][nmCol] = value;
    }

    buildHtmlTable(){
    ...
    }
}

На самом деле вышеприведенный код работает, но машинопись работает в следующих методах:

Свойство 'fnset' типа '(nmRow:string, nmCol: string, value: TYPE) => void 'нельзя назначить типу строкового индекса' {[idCol: string]: TYPE;} '. ts (2411)

Что может быть исправлением или правильным методом для достижения этой цели?

1 Ответ

0 голосов
/ 03 января 2019

Подпись индекса должна быть совместима со ВСЕМИ членами типа.Это включает в себя методы класса.

Лучшим решением было бы не использовать фактический класс для хранения этих динамических значений.Используйте отдельный выделенный объект, который вы можете держать в поле.Это позволяет избежать случайного переопределения методов класса (например, кто-то может вызвать fnset('fnset', '', 0) и переопределить метод `fnset)

class TMatrix<TYPE>{

    data: { [idRow: string]: { [idCol: string]: TYPE } } = {};

    fnset(nmRow: string, nmCol: string, value: TYPE ) {
    if (!this.data[nmRow]) 
        this.data[nmRow] = {};
    this.data[nmRow][nmCol] = value;
    }

    buildHtmlTable(){

    }
}

Если вы действительно хотите сохранить данные в классе, вам нужно сделать подпись индексасовместим со всеми членами:

class TMatrix<TYPE>{

    [idRow: string]: { [idCol: string]: TYPE } | TMatrix<TYPE>[keyof TMatrix<TYPE>]

    fnset(nmRow: string, nmCol: string, value: TYPE) {
        const data = this[nmRow];
        if (!data) {
            this[nmRow] = data;
        }
        if (typeof data === 'function') { // gurad agains overriding memebers, depeding on class memebers this may have to change to exclude other members, this works if you only have extra methods, no other fields
            throw  "don't override methods"
        }
        data[nmCol] = value
    }

    buildHtmlTable(){

    }
}
...