Проблема в том, что вызывающий абонент решает T
.Если this._service
определено как IServiceBase | null
, у вас есть две проблемы.
T
может быть IServiceBase
, поэтому присвоение IServiceBase | null
не является безопасным для типа, поскольку this._service
может быть нулевым T
может быть типом, производным от IServiceBase
(т.е. IExtendedServiceBase
).Так что this._service
никак не удовлетворит это T
.
Этих причин достаточно, чтобы компилятор отклонил это.Вы могли бы форсировать вещи с помощью утверждения типа (this._service as T
), или вы могли бы вообще не делать этот универсальный тип, поскольку вызывающая сторона на самом деле не контролирует T
:
function GetService(): INullableServiceBase
{
return this._service;
}
Или делаетсодержит класс generic для типа службы:
class ServiceFactory<T extends INullableServiceBase> {
constructor(private _service: T) { }
public GetService(): T {
return this._service;
}
}
Но без контекста трудно сказать, что будет работать лучше всего.