Рассмотрим следующий класс
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
, а не тип объединения. Это может быть ошибка? Возможно ли то, что я пытаюсь?
Большое спасибо заранее.