我想念一些东西。这太简单了,不会给我带来麻烦。
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);
}
}
答案 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
的值,则可能必须在某个地方将其传递给函数或类构造函数。
哦,希望能有所帮助。祝你好运!