Вы не знаете, что {id: 1}
является допустимым значением типа T
.Ограничение T extends Entity
означает, что T
может быть любым подтипом Entity
, выбранным кодом, который вызывает конструктор SearchServiceBase
.Внутри реализации GetAll()
вы точно не знаете, что будет T
.
Например, изменив код на следующий минимальный воспроизводимый пример (я удалил зависимости от angular, поскольку это, вероятно, не ваша проблема):
class Entity {
id: number = 0;
}
class SearchServiceBase<T extends Entity> {
public GetAll() {
const values: T[] = [
{ id: 1 } //<-- ERROR Can't assign to type T
];
}
}
Подумайте, что происходитсо следующим кодом:
class Hmm extends Entity {
readonly hmm = "hmmmmmm";
}
const hmmSearch = new SearchServiceBase<Hmm>();
hmmSearch.GetAll(); // ?
Что происходит при запуске hmmSearch.GetAll()
?Ну, это эквивалент:
class HmmSearchServiceBase {
public GetAll() {
const values: Hmm[] = [
{ id: 1 } //<-- ERROR Property 'hmm' is missing
];
}
}
И, как вы можете видеть, {id: 1}
не является действительным Hmm
.Таким образом, компилятор вправе выдать ошибку в исходном коде.
Теперь я не уверен, как исправить этот код, чтобы он работал, поскольку я недостаточно знаком с angular или rxjs, чтобы понятьиз того, что вы пытаетесь сделать.Часто невозможно присвоить значение конкретного типа переменной универсального типа, поскольку гарантировать, что конкретный тип можно назначить для каждого возможного создания экземпляра универсального типа, сложно.Если вам нужно значение универсального типа T
, вам, вероятно, понадобится передать его в конструктор функции или класса.
Хорошо, надеюсь, это поможет.Удачи!
Ссылка на код