如何正确缩小“未知”类型

Max*_*lan 11 typescript typescript-typings

tl;博士为什么

const func = (a: unknown) => {
  if (a && typeof a === 'object' && 'b' in a) {
    a.b;
  }
};
Run Code Online (Sandbox Code Playgroud)

给出以下错误信息

Property 'b' does not exist on type 'object'.
Run Code Online (Sandbox Code Playgroud)

编辑:在更仔细地研究这个问题之后,我有一个更简单的例子。所以让我重新表述一下我的问题:

如何缩小objectTypeScript 中的输入范围?

tl;博士为什么

const func = (a: object) => {
  if ('b' in a) {
    a.b;
  }
Run Code Online (Sandbox Code Playgroud)

给出以下错误信息:

Property 'b' does not exist on type 'object'.
Run Code Online (Sandbox Code Playgroud)

小智 9

您应该仔细看看自定义类型保护。它们基本上让编译器知道,如果条件通过,则检查的值将具有特定类型。

在你的情况下:

  1. 定义自定义类型保护
const hasB = (value: unknown): value is { b: unknown } => {
  return (
    typeof value === 'object'
    && value !== null
    && 'b' in value
  );
}
Run Code Online (Sandbox Code Playgroud)
  1. 用它来检验你的价值
const func = (a: unknown) => {
  if (hasB(a)) {
    a.b;
  }
};
Run Code Online (Sandbox Code Playgroud)

游乐场示例

  • 谢谢。我想我知道这也是可能的,但我不明白为什么在这种情况下有必要。编译器应该能够推断“{b:未知}”,而无需使用自定义类型保护。这是 TypeScript 的已知限制/未来功能,还是有原因导致类型无法正常缩小? (2认同)