Храните экземпляры класса generi c на карте, сохраняя при этом их правильно набранные - PullRequest
0 голосов
/ 14 июля 2020

В TypeScript я хотел бы хранить экземпляры класса generi c (здесь class Foo) в Map.

Однако я не получаю желаемых результатов, поскольку значения карты (очевидно) неправильно набраны из-за использования any. Есть ли способ сделать это?

Я не уверен, что использовать Record или псевдонимы типов стоит посмотреть.

class Foo<T> {
  t: T;
}

class Bar {

  // Use of any because I am not sure about the right way
  map: Map<string, any> = new Map();
}

const bar = new Bar();

bar.map.set('numberEntry', new Foo<number>());
bar.map.set('stringEntry', new Foo<string>());

const n = bar.map.get('numberEntry').t;
const s = bar.map.get('stringEntry').t;

console.log(typeof n); // undefined; should be 'number'
console.log(typeof s); // undefined; should be 'string'

Пожалуйста, дайте мне знать, если есть дополнительные сведения необходимо.

1 Ответ

2 голосов
/ 15 июля 2020

Прежде всего typeof n - это проверка во время выполнения, и здесь у нас есть проблема во время выполнения, поскольку наши экземпляры Foo не имеют значений в поле t. В коде нет присвоения этому полю. new Foo<number>() создает экземпляр Foo с полем undefined t. Нам нужно как-то пройти т.к. Мы можем исправить это следующим образом:

class Foo<T> {
  t: T;
  constructor(t: T) {
    this.t = t;
  }
}

Теперь о наборе и использовании any.

Если мы используем Set, то невозможно сопоставить ключ набора с определенным типом значения. Мы можем сказать, что у этого набора есть несколько возможных типов, в этом примере это будет:

Map<string, Foo<string | number>> = new Map();

Полный рабочий код

Итак, мы говорим на нашей карте, что мы сохранять значения Foo с полями string или number.

Кстати. Если мы хотим иметь отношение типа ключ -> значение, мы должны использовать POJO:

const map: {
  numberEntry: Foo<number>;
  stringEntry: Foo<string>;
} = {
  numberEntry: new Foo(1),
  stringEntry: new Foo("a")
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...