Основная проблема заключается в том, что mode
- это поле, которое не существует ни в одном члене Notification | CustomNotification
union. Проверка поля mode
на наличие объекта Notification
запрещена, так как у него нет такого поля. Ниже мои предложения о том, как справиться с вашей проблемой.
Решение одно - объединение типов с режимом по умолчанию
Я бы рассмотрел вместо того, чтобы иметь здесь двойные типы, иметь один тип и вводить внутрь Modes
какой-то нейтральный элемент позволяет сказать - default
, когда мы делаем так, чтобы проблема всех типов go отсутствовала, и нам не нужно делать никаких утверждений типа или защитников. Рассмотрим:
enum Modes {
error,
warning,
default, // neutral value
}
type Notification = {
title: string;
text: string;
mode: Modes;
};
interface Options {
defaultNotification: Notification;
customNotification?: Notification;
}
// getting active notification helper
const getNotification = (options: Options): Notification => {
return options.customNotification ?? options.defaultNotification;
}
// using
const notification = getNotification(options);
if (notification.mode !== Modes.error) { /** code here */ }
Единственное, что нам нужно сделать, это установить defaultNotification
для объекта с mode
равным Modes.defalut
.
Решение два - режим как явное неопределенное поле
В конце концов, если вы хотите сохранить Modes
в текущей форме, мы можем ввести поле mode
как поле undefined
в defaultNotification
. Рассмотрим следующее:
type BaseNotification = {
title: string;
text: string;
};
type DefNotification = BaseNotification & { mode?: undefined } // pay attention here
type CustomNotification = BaseNotification & { mode: Modes }
type Notification = DefNotification | CustomNotification;
interface Options {
defaultNotification: DefNotification;
customNotification?: CustomNotification;
}
const getNotification = (options: Options): Notification => {
return options.customNotification ?? options.defaultNotification;
}
Главное здесь - { mode?: undefined }
, мы говорим, что наше DefNotification
имеет поле mode
, но единственное возможное значение для него - undefined
.