выводить ключевое слово для получения универсального типа из базового класса - PullRequest
0 голосов
/ 18 ноября 2018

Рассмотрим следующий класс

class SomeBaseClass<T extends string | number> {
    ...
}

И следующий условный тип с использованием ключевого слова infer

type ExtractInner<T> = T extends SomeBaseClass<infer U> ? U : T;

С этим мы можем извлечь общий тип, используемый в SomeBaseClass, как это (это из документов, более или менее)

type InferredString = ExtractInner<SomeBaseClass<string>>  // InferredString is just type string

В моем чуть более продвинутом сценарии дело обстоит следующим образом

class StringVersion extends SomeBaseClass<string> {
    ...
}
class NumberVersion extends SomeBaseClass<number> {
    ...
}

Как можно определить тип ExtractInnerWithExtend так, чтобы он был эквивалентен ExtractInner? I.e.:

type InferredStringWithExtend = ExtractInnerWithExtend<StringVersion>  // InferredStringWithExtend should be string
type InferredNumberWithExtend = ExtractInnerWithExtend<NumberVersion>  // InferredStringWithExtend should be number

Использование ExtractInner в этом сценарии приведет к просто string | number, я фактически ожидал получить либо string или number, а не тип объединения. Это может быть ошибка? Возможно ли то, что я пытаюсь?

Большое спасибо заранее.

1 Ответ

0 голосов
/ 18 ноября 2018

ExtractInner будет работать с производной версией типов с одним условием: что вы действительно используете тип в базовом классе каким-то образом

class SomeBaseClass<T extends string | number> {

  private value!: T

  // Any of these will also work
  //value!: T
  //m(v:T): void {}
  //m(): T { return null as any }
}

type ExtractInner<T> = T extends SomeBaseClass<infer U> ? U : T;


class StringVersion extends SomeBaseClass<string> {}
class NumberVersion extends SomeBaseClass<number> {}

type InferredStringWithExtend = ExtractInner<StringVersion>  // string
type InferredNumberWithExtend = ExtractInner<NumberVersion>  // number

Причиной такого поведения является структурный характер системы типов машинописи, структура типов имеет большее значение, чем объявления наследования.

...