首页 > 解决方案 > 打字稿:如果另一个属性与条件匹配,则声明一个接口属性被定义

问题描述

我正在声明一个接口,该接口包装从 TCP 套接字获得的字符串数据。该status属性表示获取数据的当前状态。pending如果请求已发送但尚未收到响应,则设置为是否failure返回错误,以及success是否返回完整响应。

interface TCPData {
  data?: string
  status: 'success' | 'pending' | 'failure'
}

因此,我知道this.dataif 保证不会是未定义的this.status === 'success'。问题是现在,每当我想访问数据时,我仍然必须进行类型检查,this.data因为我将其声明为string | undefined.

const tcp_data: DataInterface = readTCPData()
if (tcp_data.status === 'success') {
  console.log(tcp_data.data) // <<< type error: data could be undefined
}

我有什么方法可以声明,如果一个属性匹配某个条件(例如this.status === 'success'),那么另一个属性(例如this.data)保证不会未定义?

标签: typescript

解决方案


使用 atype并在两种可能的形状之间交替:

type TCPData = {
  data: string
  status: 'success'
} | {
  data?: string // or maybe remove this completely?
  status: 'pending' | 'failure'
}

推荐阅读