我可以告诉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
?你试过了吗?我不知道这些,但我刚试过,它们很管用。如果你回答这个问题,我会接受的。