如何在TypeScript中的条件中使用变量来缩小类型?

时间:2019-10-22 22:25:36

标签: typescript

以下内容无法编译:

function returnString(): string {
  const s = Math.random() < 0.5 ? 'hey' : null;
  const sIsString = s !== null;
  if (sIsString) {
    return s; // <-- problematic line
  }
  return 'hey';
}

错误:Type '"hey" | null' is not assignable to type 'string'.

在条件内进行比较时,它执行

function returnString(): string {
  const s = Math.random() < 0.5 ? 'hey' : null;
  if (s !== null) {
    return s;
  }
  return 'hey';
}

为什么将类型检查放在变量内对编译器有影响?

1 个答案:

答案 0 :(得分:2)

可以缩小诸如w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(list) 之类的联合类型变量的机制称为control flow analysis,但它仅基于每个变量发生。

编译器无法在您的相关变量ss之间建立连接。因此,如果sIsStringsIsString,则您知道true,但TS却不知道。它只看s !== nulls,就好像它们是完全独立的。

第二种情况有效,因为您直接在变量sIsString上执行类型保护检查,并且上述控制流分析对每个变量都有效。因此,在进行s类型检查之后,其并集类型string | null可以适当地缩小到string