Массив Общего Типа, не показывающий свойство - PullRequest
0 голосов
/ 10 июля 2019

Я что-то упустил.Это слишком просто, чтобы доставлять мне проблемы.

Entity.ts

    export class Entity {
    id: number;
}

search-bar.ts

import { Entity } from './../resources/entity';
import { Injectable } from '@angular/core';
import { Observable, of } from 'rxjs';

@Injectable()
export abstract class SearchServiceBase<T extends Entity> {
    public GetAll(): Observable<T[]> {
        const values: T[] = [
            { id : 1 } <-- ERROR Can't assign to type T
        ];

        return of(values);
    }
}

1 Ответ

2 голосов
/ 10 июля 2019

Вы не знаете, что {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, вам, вероятно, понадобится передать его в конструктор функции или класса.

Хорошо, надеюсь, это поможет.Удачи!

Ссылка на код

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...