为什么typescript认为我有一个错误时,它只能是空的?

wkyowqbh  于 2023-11-20  发布在  TypeScript
关注(0)|答案(3)|浏览(167)

我遇到这样的情况,Typescript的行为与我预期的不一样(注意,我不能在整个项目中打开strictNullChecks):

const error = new Error("I'm and error");
const textError = "Also and error";

const printErrorMessage = (err: string | Error) => {
  const errorMessage = (err === null || typeof err === "string") ? err : err?.message ?? err?.name ?? 'unknown error';
  if (errorMessage) {
    console.log(errorMessage);
  }
  return errorMessage;
}

const errorMessageOne = printErrorMessage(error);
const errorMessageTwo = printErrorMessage(textError);
const errorMessageThree = printErrorMessage(null);

字符串
我的希望是err作为自身返回的only时间是如果它是nullstring,但这意味着返回值应该是Nullstring而不是string | Error


的数据
因为这个函数可以发送一个null对象,但我不想将其转换为字符串'unknown error',所以我不能让null通过。
这是我的TSPlayground,我已经确认这发生在我的开发环境之外。

8cdiaqws

8cdiaqws1#

您需要启用strictNullChecks(我建议通过"strict": true启用所有strict选项)。您共享的Playground没有它,这就是为什么返回类型是string | Error。如果您启用它,您将获得string | null

u59ebvdq

u59ebvdq2#

编辑:@ T. J.克劳德的答案是正确的。
我的回答是:
如果你想将null传递给printErrorMessage函数,你应该在函数签名中接受null

const printErrorMessage = (err: string | Error | null) => { ... }

字符串
推断的返回类型将是string | null

sshcrbum

sshcrbum3#

在发布了我的问题并进行了更多的尝试之后,我找到了一个临时的解决方案(不推荐,但我暂时需要一个停止间隙)。
您可以将分配行更改为具有强制转换(不推荐!)以解决此问题:const errorMessage = (err === null || typeof err === "string") ? (err as null | string) : err?.message ?? err?.name ?? 'unknown error';
如果你能做到的话,一定要遵循其他答案。

相关问题