我遇到这样的情况,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时间是如果它是null
或string
,但这意味着返回值应该是Null
或string
而不是string | Error
。
的数据
因为这个函数可以发送一个null对象,但我不想将其转换为字符串'unknown error',所以我不能让null通过。
这是我的TSPlayground,我已经确认这发生在我的开发环境之外。
3条答案
按热度按时间8cdiaqws1#
您需要启用
strictNullChecks
(我建议通过"strict": true
启用所有strict
选项)。您共享的Playground没有它,这就是为什么返回类型是string | Error
。如果您启用它,您将获得string | null
。u59ebvdq2#
编辑:@ T. J.克劳德的答案是正确的。
我的回答是:
如果你想将
null
传递给printErrorMessage
函数,你应该在函数签名中接受null
:字符串
推断的返回类型将是
string | null
。sshcrbum3#
在发布了我的问题并进行了更多的尝试之后,我找到了一个临时的解决方案(不推荐,但我暂时需要一个停止间隙)。
您可以将分配行更改为具有强制转换(不推荐!)以解决此问题:
const errorMessage = (err === null || typeof err === "string") ? (err as null | string) : err?.message ?? err?.name ?? 'unknown error';
如果你能做到的话,一定要遵循其他答案。