类型不会从使用类型保护的函数中缩小

Type is not narrowed from function using type guards

我有一个函数接受类似结构的参数,并且在函数内部使用类型保护来确定传入参数的类型。

type Ex1 = {
  contents: 'contents',
  param1: 'yes'
}

type Ex2 = {
  contents: 'contents',
  param2: true
}

type Ex = Ex1 | Ex2;

export const exampleFunc = (example: Ex): Ex => {
  const isEx1 = (unknownExample: Ex): unknownExample is Ex1 => {
    return (unknownExample as Ex1).param1 === undefined ? false : true;
  }

  const execute = (): Ex => {
    if (isEx1(example)) {
      return example;
    }

    return example;
  }

  return execute()
}

在我的实际应用中,return编辑了一个不同类型的复杂对象,但在这个例子中,我只是return同一个对象。

当我执行函数时

const ex1: Ex1 = {
  contents: 'contents',
  param1: 'yes'
}
const test = exampleFunc(ex1);

在我的 IDE 中,我可以看到 TS 正确理解了以下块中的 example

if (isEx1(example)) {
  return example;
}

类型正确

(parameter) example: Ex1

您可以看到分配给 example 的对象是从函数中 return 编辑的,在本例中分配给 test

然而,尽管理解 return 块中的正确类型,Typscript 并没有将 test 分配为类型 Ex1 而是将其分配为更广泛的类型 Ex.

const test = exampleFunc(ex1);

这意味着下面会抛出一个错误

test.param1

Property 'param1' does not exist on type 'Ex'.

类型保护仅在当前执行块中有用,还是我误解了它们的用法?

缩小仅适用于它发生的本地范围。由于您的 exampleFunc 声明它 returns 为 Ex,类型系统会将其视为 Ex,而不管函数内部发生了什么。