@Bone

Как написать type guard для отдельного поля интерфейса?

Есть интерфейс у которого есть поле type и от поля type зависит тип поля attach.
export interface PostAttach {
    type: "video"|"audio",
    attach: AttachVideo|AttachAudio
}
Как мне написать type guard, который получал бы на вход PostAttach и определял тип поля attach? Типа такого:
export function isAudio(attach: PostAttach): attach.attach is AttachAudio {
    return attach.type === "audio";
}
  • Вопрос задан
  • 247 просмотров
Решения вопроса 1
Lynn
@Lynn
nginx, js, css
interface PostAttachVideo {
  type: 'video'
  attach: AttachVideo
}

interface PostAttachAudio {
  type: 'audio'
  attach: AttachAudio
}

type PostAttach = PostAttachAudio | PostAttachVideo

function isAudio(attach: PostAttach): attach is PostAttachAudio {
    return attach.type === 'audio';
}


песочница
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Kozack
@Kozack
Thinking about a11y
На самом деле, тут отдельная функция и не нужна. Обычного if хватит: Песочница

А при вашем подходе:
export interface PostAttach {
    type: "video"|"audio",
    attach: AttachVideo|AttachAudio
}


TS никак не увидит связи между полями type и attach. Для него это два никак не связанных поля. Он предполагает, что возможны любые комбинации "video"|"audio" и AttachVideo|AttachAudio и тот факт что type = 'video' ничего не говорит про тип attach.

Поэтому, их нужно разделить из одного универсального интерфейса, на несколько частных случаев.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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