簡體   English   中英

通用類型數組未顯示屬性

[英]Array of Generic Type not showing property

我想念一些東西。 這太簡單了,不能給我帶來麻煩。

實體

    export class Entity {
    id: number;
}

搜索欄

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);
    }
}

您不知道{id: 1}是類型T的有效值。 約束T extends Entity意味着T可以是調用SearchServiceBase的構造函數的代碼選擇的Entity任何子類型。 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的值,則可能必須在某個地方將其傳遞給函數或類構造函數。

哦,希望對您有所幫助。 祝好運!

鏈接到代碼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM