У меня есть ситуация, когда общий тип ограничен типом объединения, но я считаю, что это не приводит к тому, что сужение типа работает должным образом. Приведенный ниже фрагмент кода показывает, что происходит.
function somefunc<T extends string | number>(input: T): T {
if (typeof input === "string") {
// expecting input to be of type "string"
// but input becomes of type T & "string"
input
} else {
// expecting input to be of type "number"
// but input becomes of type T extends string | number
input
}
}
Если я откажусь от универсальных шаблонов и просто аннотирую аргумент функции как string | number
, он работает, но для моего варианта использования мне нужны общие ограничения.
Изменить
Вариант использования - это, по сути, попытка также использовать это с условными типами. В основном я хочу, чтобы тип результата был условным типом, который зависит от типа ввода. Поэтому, когда тип ввода number
, результат также number
, когда ввод string
, результат также становится string
. В основном это:
type Result<T> = T extends string ? string : number
function somefunc<T extends string | number>(input: T): Result<T> {
if (typeof input === "string") {
// expecting input to be of type "string"
// but input becomes of type T & "string"
input
} else {
// expecting input to be of type "number"
// but input becomes of type T extends string | number
input
}
}
Я, вероятно, что-то упускаю, но вопрос в том, как мне использовать универсальное ограничение на основе объединения и работать с сужением типа, как я ожидал. В приведенном выше коде это будет означать, что в ветке if
input
становится типом string
, а в ветке else
он становится number
(или, по крайней мере, становится T & number
)
** Редактировать **
Я смог добиться желаемого, используя перегрузку функций. Мне было только интересно, можно ли добиться того же, используя обобщенные и условные типы.
somefunc
метод будет принимать все, что угодно, кроме строковых или числовых типов. Если вы знаете, чтоinput
должен состоять из строки или числа, разве вы не можете просто сделатьfunction somefunc(input: string | number): string | number
? - person Terry   schedule 14.01.2021T & number
, то это все равно идти, аналогично тому, как ветвь if имеет типT & string
. но прямо сейчас иначе T расширяет строку | количество - person Finlay Weber   schedule 14.01.2021