首页 > 解决方案 > 返回类型的类型检查

问题描述

我有以下代码:

interface Box<T> {
  value: T | null;
}

function foo<T>(b: Box<T>, defaultVal: T): T {
  return b.value || defaultVal;
}

const s: string | null = null;
const t = foo({ value: s }, { value: "def" });
console.log(t);

为什么会这样编译?我希望在第二个参数上出现类型错误。

标签: typescript

解决方案


这是因为即使s有类型签名,它的类型也会因为赋值string | null而缩小。null如果您将鼠标悬停在 上,您可以看到这一点s。如果您将鼠标悬停在 上foo,则显示T选择为{value: string},这使应用程序类型正确。

对于s具有实际联合类型的,您将收到预期的错误:

const test = (s: string | null) => {
  const t = foo({ value: s }, { value: "def" }); // Error, as expected
}

TypeScript 游乐场


推荐阅读