@AlexWeb6667
Web-дизайнер с опытом FullStack разработки

Как задать условный дженерик, для входящих в функцию параметров?

Всем, привет. Прошу о помощи более опытных разработчиков

Хочу написать конструкцию которая будет возвращать тип исходя из того
Какой тип был передан в параметр, ничего не получается из за недостатка теории

Вот в какую сторону пошел, но все равно не работает как нужно(в type A, в T будто не попадают введенные данные)
Подскажите пожалуйста, как реализовать подобное?

type C = {
    type: string
}

type A<T> = T extends C[] ? C[] : C

type Gen = <T>(a: A<T>) => A<T>

const gen: Gen = (a) => {
    return a
}

//Работает
const res = gen({
    type: 'string'
})

//Не работает
const res = gen([{
    type: 'string'
}])
  • Вопрос задан
  • 109 просмотров
Решения вопроса 2
profesor08
@profesor08
// если тип функции надо вынести, но тогда надо будет явно указывать тип аргумента
type FN<T> = (arg: T) => T;

type ItemType = {
    type: string;
}

const fn: FN<ItemType | ItemType[]> = (arg) => {
    return arg;
}


// если просто надо передать какой-то тип в функцию либо массив из элементов этого-же типа
const fn = <T>(arg: T | T[]): T | T[] => {
    return arg;
}


// можно заранее определить что элемент может быть какого-то типа, либо это может быть массив элементов этого же типа
type A<T> = T | T[];

const fn = <T>(arg: A<T>): A<T> => {
    return arg;
}


// в любом случае придется потом проверять вернувшийся результат

const res1 = fn({
    type: 'string'
})

const res2 = fn([{
    type: 'string'
}])

if (Array.isArray(res1)) {
    res1[0] //
}
else {
    res1.type //
}
Ответ написан
Комментировать
Aetae
@Aetae Куратор тега TypeScript
Тлен
Вообще это делается просто так:
type C = {
    type: string
}

type Gen = <T extends C | C[]>(a: T) => T

const gen: Gen = (a) => {
    return a
}

Если надо что-то более сложное с возвратным значением сделать, то так:
type Gen = <T extends C | C[]>(a: T) => T extends C[] ? 1 : 2
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы