Я пытаюсь вывести тип возвращаемого значения на основе заданных аргументов.
Я пытался использовать дженерики.
type Getter<T> = T extends string ? string : object
function get<T> (key?: T ): Getter<T|undefined> {
if (key) {
return 'string'
} else {
return {}
}
}
let single = get('htewr')
let multi = get()
multi уже делает вывод, что он должен быть объектного типа. Однако single по-прежнему делает вывод, что это тип string | object, а не просто тип строки.






Вы сталкиваетесь с дистрибутивным поведением условных типов. Getter<T | undefined> = Getter<T> | Getter<undefined> = Getter<T> | object Таким образом, независимо от T вы получите object в результирующем объединении.
Это работает так, как ожидалось:
type Getter<T> = T extends string ? string : object
function get<T> (key?: T): Getter<T> {
if (key) {
return 'string' as Getter<T>
} else {
return {} as Getter<T>
}
}
let single = get('htewr') // string
let multi = get() // object
Перегрузка, вероятно, решит эту проблему. typescriptlang.org/docs/handbook/functions.html#overloads