打字稿:接口中跨属性的类型防护

时间:2020-08-27 20:51:29

标签: javascript typescript typescript-typings

在打字稿中,我可以声明一个函数类型防护,以检查属性是否为null或类似于以下内容:

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在评论中指出的那样,通过空检查很容易处理这种初始情况。因此,我要添加另一个问题示例,该问题需要某种类型的类型保护,而不是简单的null检查。

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;
}

1 个答案:

答案 0 :(得分:1)

我不确定我是否正确理解了这个问题,但是您可以做类似的事情

type IApiResponse =  {
  readonly record: IResponseTypeA;
  readonly isTypeA: true;
} | {
  readonly record: IResponseTypeB;
  readonly isTypeA: false;
}

然后如果您有一个函数,它将根据变量推断类型

function foo(bar: IApiResponse){
    if (bar.isTypeA){
     /// record is not from type IResponseTypeA
    }
}