【问题标题】:Type is not narrowed from function using type guards类型不是使用类型保护从函数中缩小的
【发布时间】:2021-09-09 00:20:15
【问题描述】:

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

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 中,我可以看到 TS 正确理解了以下块中的 example

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

是正确的类型

(参数)示例:Ex1

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

然而,尽管理解了返回块中的正确类型,Typscript 不会将 test 分配为类型 Ex1,而是将其分配为更广泛的类型 Ex

const test = exampleFunc(ex1);

表示下面会抛出错误

test.param1

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

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

【问题讨论】:

    标签: typescript types narrowing typeguards


    【解决方案1】:

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

    【讨论】:

    • 鉴于您正在导出函数,这一点尤其正确;可以想象,在 TypeScript 的未来版本中,通过返回在模块外部不可见的函数来扩展类型保护,但是当它是公共接口的一部分时,这是一个非首创。
    猜你喜欢
    • 2019-03-02
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    • 2020-06-27
    • 1970-01-01
    相关资源
    最近更新 更多