Обобщение TypeScript «расширяет» ограничение: есть ли обнуляемое ограничение? - PullRequest
1 голос
/ 18 марта 2019

Похоже, что следующее не компилируется:

interface IServiceBase {};
type INullableServiceBase = IServiceBase | undefined;

public GetService<T extends INullableServiceBase>(): T
{
  return this._service;
}

Это приводит к TS2322: тип 'INullableServiceBase' не может быть присвоен типу 'T'. Тип «undefined» не может быть присвоен типу «T».

Как определить общее ограничение, разрешающее типы, допускающие значения NULL?

1 Ответ

1 голос
/ 18 марта 2019

Проблема в том, что вызывающий абонент решает T.Если this._service определено как IServiceBase | null, у вас есть две проблемы.

  1. T может быть IServiceBase, поэтому присвоение IServiceBase | null не является безопасным для типа, поскольку this._service может быть нулевым
  2. 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;
    }
}

Но без контекста трудно сказать, что будет работать лучше всего.

...