Проблема в том, что функция принимает параметр типа someGeneric<T>
, если мы попытаемся передать параметр типа someGeneric<number> | someGeneric<string>
typcript не будет пытаться вывести T
, из этого просто скажет, что объединение несовместимос типом someGeneric<T>
Мы можем изменить определение функции так, чтобы параметр типа расширялся someGeneric<any>
.Это ограничение будет совместимо с объединением.Затем мы можем использовать условный тип для извлечения типа элемента из T
, используя условный тип.Поскольку условные типы распределяются по объединениям, результатом извлечения будет объединение общих параметров в someGeneric<T>
type someGeneric<T> = { item: T };
type stringGeneric = someGeneric<string>;
type numberGeneric = someGeneric<number>;
type extractItemFromSomeGeneric<T extends someGeneric<any>> = T extends someGeneric<infer U> ? U : never;
type someFunction = <T extends someGeneric<any>>(generic: T) => extractItemFromSomeGeneric<T>;
const someFunction: someFunction = (generic) => generic.item;
const stringGeneric: stringGeneric = { item: 'some String' },
numberGeneric: numberGeneric = { item: 12 };
let someGeneric = [stringGeneric, numberGeneric];
someGeneric.forEach(generic => {
someFunction(generic); // retruns string | number
});
Ссылка для игровой площадки