0

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

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()
}

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

当我执行该功能

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

在我的 IDE 中,我可以看到 TSexample在以下块中正确理解了这一点

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

是正确的类型

(参数)示例:Ex1

您可以看到分配给的对象example是从函数返回的,在这种情况下分配给test

然而,尽管理解了返回块中的正确类型,但 Typscript 并没有将其分配test为 typeEx1而是将其分配为更广泛的 type Ex

const test = exampleFunc(ex1);

这意味着以下会引发错误

test.param1

类型“Ex”上不存在属性“param1”。

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

4

1 回答 1

3

缩小仅适用于它发生的局部范围。由于您exampleFunc声明它返回 an Ex,因此类型系统会将其视为 an ,Ex无论函数内部发生什么。

于 2021-09-08T16:20:15.123 回答