typescript - 比较 `!==` 时,此条件将始终返回 true
问题描述
我对这个错误感到困惑。我有一个enum
和一个type
enum EventName {
None = 'None',
Delete = 'Delete',
Add = 'Add'
}
type EventObject = {
name: Exclude<EventName, EventName.None>,
id: number,
} | {
name: EventName.None
};
比较一个EventObject
变量Add
或Delete
正确推断我有一个`id`
但是试图做到这一点没有失败:
由于类型为“EventName.Delete |”,此条件将始终返回“false”。EventName.Add' 和 'EventName.None' 没有重叠。
我还没有找到如何正确映射它。
这里的操场
解决方案
如果您声明const
具有较窄类型值的完整类型,则通常会发生这些类型的错误。例如:
const x: EventObject = { name: EventName.None }
尽管类型签名为EventObject
,但实际类型x
缩小为{ name: EventName.None }
,这解释了错误。
type Tx = typeof x // type is not EventObject but narrowed to { name: EventName.None }
type Txname = typeof x.name // type is EventName.None
if (x.name === EventName.Add) {
// ERROR: .. 'EventName.None' and 'EventName.Add' have no overlap.
}
要使用x
of 类型进行测试,EventObject
您可以将其声明为函数参数:
const test = (x: EventObject) => {
type Tx = typeof x // type is EventObject
type Txname = typeof x.name // type is EventName
if (x.name === EventName.Add) {
type Txname2 = typeof x.name // type is EventName.Add
}
}
或者,如果您不执行代码,则可以只使用{} as any
该const
值:
const y: EventObject = {} as any
type Ty = typeof y // type is EventObject
type Tyname = typeof y.name // type is EventName
if (y.name === EventName.Add) {
type Txname2 = typeof x.name // type is EventName.Add
}
推荐阅读
- r - 如何在 R 中求解具有时间相关参数的 ODE 系统?
- reactjs - 修复漏洞 - “immer 中的关键原型污染”已修补 >=9.0.6
- java - Liquibase 无法找到用于 4.0 及更高版本的集成测试的更改日志文件
- c++ - 如何在浏览器上的 emscripten 构建代码上执行 WASM 文件
- javascript - Axios Promise.allSettled() 问题
- android - Amazon IAP Android onProductDataResponse 总是失败
- javascript - 如何使用套接字 io 断开客户端?
- android - 标记未在 Android 中的地图上显示
- c++ - DFS 使用 1D 类似 2D 向量
- php - Laravel:从存储外部磁盘中提取 ZipArchive 文件