首页 > 解决方案 > 比较 `!==` 时,此条件将始终返回 true

问题描述

我对这个错误感到困惑。我有一个enum和一个type

 enum EventName {
  None = 'None',
  Delete = 'Delete',
  Add = 'Add'
}

 type EventObject = {
  name: Exclude<EventName, EventName.None>,
  id: number,
} | {
  name: EventName.None
};

比较一个EventObject变量AddDelete正确推断我有一个`id` 我有身份证

但是试图做到这一点没有失败:

由于类型为“EventName.Delete |”,此条件将始终返回“false”。EventName.Add' 和 'EventName.None' 没有重叠。

我还没有找到如何正确映射它。

这里的操场

标签: typescript

解决方案


如果您声明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.
}

要使用xof 类型进行测试,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 anyconst值:

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
}

TypeScript 游乐场


推荐阅读