我可以告诉TypeScript,如果输入为null,函数将只输出null吗?

我可以告诉TypeScript,如果输入为null,函数将只输出null吗?,typescript,Typescript,我有一个函数可以从输入数据的字符串中去除空字节: export function stripNullBytes(str: string | null): string | null { return str?.replace(/\0/g, '') ?? null } 我的一些输入字符串可以为null,而一些不能为null(它们来自数据库)。类似地,有些输出字符串可以为null,有些则不能为null 如果我对一个不能为null的字符串调用stripNullBytes(因此输出也不能为null

我有一个函数可以从输入数据的字符串中去除空字节:

export function stripNullBytes(str: string | null): string | null {
  return str?.replace(/\0/g, '') ?? null
}
我的一些输入字符串可以为null,而一些不能为null(它们来自数据库)。类似地,有些输出字符串可以为null,有些则不能为null

如果我对一个不能为null的字符串调用
stripNullBytes
(因此输出也不能为null),Typescript会抱怨
stripNullBytes(cantBeNull)
的类型不正确(它是
string | null
而不是
string


有没有办法告诉TypeScript关于我的函数的这个事实?我可以使用bang操作符(
let str:string=stripNullBytes(cantBeNull)!
),但是有没有更优雅的方法来消除我犯错误的可能性呢?

目前你的函数类型是
(str:string | null)=>string | null
,这意味着字符串输入可以提供null输出,反之亦然。相反,听起来好像您想要
(str:string)=>string |(str:null)=>null
,其中字符串输出总是给出字符串输出,null输入总是给出null输出

这可以通过以下方式实现:

导出函数stripNullBytes(str:string):string;
导出函数stripNullBytes(str:null):null;
导出函数stripNullBytes(str:string | null):string | null{
返回str?替换(/\0/g',)?空
}
请注意,第三个也是最后一个定义实际上并不是重载列表的一部分;使用者只能通过前两个定义之一调用函数。这意味着您不能使用
string | null
的内容调用
stripNullBytes
。如果要保留此项,必须将其作为重载重复,但要确保首先显示更具体的定义:

[编译器]查看重载列表并继续 首先重载,尝试使用提供的 参数。如果找到匹配项,它将选择此重载作为正确的 超载。出于这个原因,通常从大多数用户处订购重载 具体到最不具体


所以您实际上希望函数类型是
(str:string)=>string |(str:null)=>null
,而不是
(str:string | null)=>string | null
?你试过了吗?我不知道这些,但我刚试过,它们很管用。如果你回答这个问题,我会接受的。