【发布时间】:2019-03-11 21:36:41
【问题描述】:
我需要创建一个接口,该接口可以是字符串,也可以是具有三个键之一的对象。
基本上我有一个函数,根据错误返回一些东西:
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,如果它有一个键,它就只有一个。
你会如何设计这样的类型或接口?
编辑:我尝试通过给它们一个问号来使键成为可选,但随后我的 linter 在 determineError 中的相应键的错误返回语句中抱怨。
【问题讨论】:
-
Re
non_field_errors、detail和email-- 它们是互斥的吗?是否有任何(或全部)可选? -
它们都是可选的。可以有一个、两个或同时存在三个。如果没有,它只是一个正在通过的字符串。
-
除了下面建议的
| string联合之外,这是 How to create a Partial-like that requires a single property to be set 的副本。 -
您的 linter 抱怨说...该属性可能是
undefined,我猜?是的,问号可以(在--strictNullChecks模式下)为属性传递undefined,因此您也需要检查它(或使用断言)。 -
您真的打算将
non_field_errors和email设为 1 元素数组(也称为 1 元组或单例)吗?这就是[string]的意思:数组中的单个字符串。如果数组可以包含多个元素,则应使用语法string[]或Array<string>。
标签: typescript types typescript-typings