Мне нужно создать интерфейс, который представляет собой строку или объект с одним из трех ключей.
В основном у меня есть функция, которая в зависимости от ошибки что-то возвращает:
export const determineError = (error: ServerAlerts): AlertError => {
if (typeof error !== "string") {
if (error.hasOwnProperty("non_field_errors")) {
return error.non_field_errors[0];
} else if (error.hasOwnProperty("detail")) {
return error.detail;
} else if (error.hasOwnProperty("email")) {
return error.email[0];
} else {
return UNKNOWN_ERROR;
}
} else {
return error;
}
};
Вот типы:
export type AlertError =
| "Unable to log in with provided credentials."
| "E-mail is not verified."
| "Password reset e-mail has been sent."
| "Verification e-mail sent."
| "A user is already registered with this e-mail address."
| "Facebook Log In is cancelled."
| string;
export interface ServerAlerts {
non_field_errors: [string];
detail: string;
email: [string];
}
Но способ, которым я разработал ServerAlerts
здесь, не работает для меня, поскольку ServerAlerts также может быть string
, и если у него есть один из его ключей, он имеет только один.
Как бы вы спроектировали такой тип или интерфейс?
РЕДАКТИРОВАТЬ: Я попытался сделать ключи необязательными, поставив им вопросительный знак, но затем мой линтер жалуется на сообщение об ошибке соответствующего ключа в determineError
.
| string
, я полагаю? Да, вопросительный знак позволяет (в режиме _2_) передать _3_ для свойства, поэтому вам также необходимо проверить это (или использовать утверждение). - person jcalz   schedule 07.10.2018undefined
и--strictNullChecks
были одноэлементными массивами (также известными как кортеж из одного элемента или одноэлемент)? Вот что означаетundefined
: одна строка в массиве. Если массивы могут иметь более одного элемента, вместо этого следует использовать синтаксис _4_ или _5_. - person jcalz   schedule 07.10.2018