@djEban

Как вывести боди в зависимости от типа?

type A = {
    type: "message";
    name: string;
}

type B = {
    type: "notification";
    age: number;
}

type C = A | B;

function handler<T extends C["type"]>(type: T, body: ...) {}

handler("message", {
    name: ""
})


Как сделать так, чтобы тайпскрипт вывел name , если передал "message"? Я никак не могу сделать что-то типа C[T] , но оно и понятно, так как это никакой не объект с полями типа T

Можно так

type C = {
    message: A;
    notification: B;
}

function handler<T extends keyof C>(type: T, body: C[T]) {}


Но не катит, так как у меня есть еще вложенные поля, которые ровно по такому же принципу мне надо разделять, типа:

type A = {
    type: "message";
    subtype: "chat" | "admin-panel"
}

 type B = {
    type: "notification";
    subtype: "text" | "file"
}
  • Вопрос задан
  • 58 просмотров
Решения вопроса 1
WblCHA
@WblCHA
Можно, конечно, написать красивее, но там сам тип тогда править надо.

function handler<T extends C["type"]>(type: T, body: Omit<C & { type: T }, 'type'>) {}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы