我有以下功能:
export function safeParseInt<T>(value: any, invalid: T = undefined as T): number | T {
if ((value ?? "") === "") return invalid;
const parsed = parseInt(String(value));
if (isNaN(parsed)) return invalid;
return value ? parsed : 0;
}
See this in the typescript playground
如您所见,它需要两个参数,并返回转换为整数的第一个参数,如果无法转换为整数,则返回第二个参数。第二个是可选的,默认为未定义。
我在输入此内容时遇到困难。如果我使用上面的版本:
function test(value: unknown) {
const r = safeParseInt(value);
const x: number | "" = safeParseInt(value);
const y: number | "" = safeParseInt(value, "");
const z: number | "" = safeParseInt(value, undefined);
}
我预计 x
和 z
上会出现错误,但 z
上只有一个错误。当我将鼠标悬停在 r
上时,我可以看到返回类型为 unknown
。
有关默认值的某些内容扰乱了推理。我尝试过返回typeof invalid
,完全删除类型提示,使 T 扩展未定义或使其扩展未知。似乎没有任何作用。
最佳答案
您应该使用重载。
export function safeParseInt(value: any): number | undefined
export function safeParseInt<T>(value: any, invalid: T): number | T
export function safeParseInt<T>(value: any, invalid: T = undefined as T): number | T {
if ((value ?? "") === "") return invalid;
const parsed = parseInt(String(value));
if (isNaN(parsed)) return invalid;
return parsed;
}
这将显式地将 safeParseInt
的返回类型设置为 number |如果
。invalid
未传递给函数,则未定义
关于typescript - 如何根据可选参数的类型确定返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75470817/