通用类型数组未显示属性

时间:2019-07-10 12:52:30

标签: angular typescript

我想念一些东西。这太简单了,不会给我带来麻烦。

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 个答案:

答案 0 :(得分:2)

您不知道{id: 1}T类型的有效值。约束T extends Entity意味着T可以是调用Entity的构造函数的代码选择的SearchServiceBase的任何子类型。在GetAll()的实现中,您不完全知道T是什么。

例如,将您的代码更改为以下minimum reproducible example(我删除了对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的值,则可能必须在某个地方将其传递给函数或类构造函数。

哦,希望能有所帮助。祝你好运!

Link to code