typescript - 打字稿:如果另一个属性与条件匹配,则声明一个接口属性被定义
问题描述
我正在声明一个接口,该接口包装从 TCP 套接字获得的字符串数据。该status
属性表示获取数据的当前状态。pending
如果请求已发送但尚未收到响应,则设置为是否failure
返回错误,以及success
是否返回完整响应。
interface TCPData {
data?: string
status: 'success' | 'pending' | 'failure'
}
因此,我知道this.data
if 保证不会是未定义的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
)保证不会未定义?
解决方案
使用 atype
并在两种可能的形状之间交替:
type TCPData = {
data: string
status: 'success'
} | {
data?: string // or maybe remove this completely?
status: 'pending' | 'failure'
}
推荐阅读
- css-tables - 我可以在事先不知道图像宽度的情况下使用 CSS 表格将图像和文本并排放置吗?
- python - Python:如何枚举列表列表并使用该列表的长度来查找值
- python - 为 pd 数据框合并 json 文件的最佳方法
- html - 列表中的 CSS last-child,每个标签周围都有标签
- sql - 比较非常不同的表
- python - 如何在python中并行压缩文件
- python - 在 Python 中使用 Pebble 重新启动/重建超时进程?
- java - 格式化 Java 输出
- android - 如何在 android 应用程序中添加一个函数来创建一个像 Piazza 或 Tophat 这样的新类,而无需手动创建新的活动和清单?
- java - 我可以对不同但可比较的输入使用相同的方法吗?