Прежде всего 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")
};