【发布时间】:2020-12-16 19:26:38
【问题描述】:
在打字稿中,我可以声明一个函数类型保护来检查属性是否为空,类似于以下内容:
interface IApiResponse<TRecord> {
readonly isDefined: boolean;
readonly record: TRecord | null;
}
const responseHasRecordDefined =
<TRecord>(apiResponse: IApiResponse<TRecord>): apiResponse.record is TRecord => apiResponse.isDefined;
但是我想知道是否有一种方法可以只使用一个接口定义来完成相同的任务?
类似于:
interface IApiResponse<TRecord> {
readonly record: TRecord | null;
readonly isDefined: this.record is TRecord;
}
编辑:
正如 Ryan 在 cmets 中指出的那样,这种初始情况很容易通过空检查来处理。因此,我添加了另一个需要某种类型保护而不是简单的空检查的问题示例。
interface IResponseTypeA {
// Anything can be in here
}
interface IResponseTypeB {
// Anything can be in here
}
interface IApiResponse {
readonly record: IResponseTypeA | IResponseTypeB;
readonly isTypeA: this.record is IResponseTypeA;
}
【问题讨论】:
-
您是否有理由检查类型保护中的布尔值,而不是直接检查
record字段是否为null?例如,这就是您无法控制的某些 API 返回的内容吗? -
你是对的,在我给出的示例中,我可以检查
record字段是否为null。我已经更新了这个问题以包含一个更通用的情况,其中两种类型的定义没有那么好,以至于像空检查这样的东西会起作用。
标签: javascript typescript typescript-typings