我很好奇是否有一个getOrFail
函数可以实现我下面的功能。如您所见,两个函数的内容相同,但参数类型不同。
export const getStringOrFail = (value: string | null, message: string = 'getStringOrFail error'): string => {
if (value !== null) return value
throw new Error(message);
}
export const getNumberOrFail = (value: number | null, message: string = 'getNumberOrFail error'): number => {
if (value !== null) return value
throw new Error(message);
}
我尝试使用泛型并将其返回,但是可以返回null
。
我该如何定义上面的功能?
答案 0 :(得分:2)
您需要做的是定义一个通用参数,该参数不包含null
:
export const getOrFail = <T extends string | number>(value: T | null, message: string = 'getOrFail error'): T => {
if (value !== null) return value
throw new Error(message);
}
如@jcalz所建议的,如果您想更通用一些,并允许除null
以外的所有内容。您可以使用{} | undefined | void
代替string | number
:
export const getOrFail = <T extends {} | undefined | void>(value: T | null, message: string = 'getOrFail error'): T => {
if (value !== null) return value
throw new Error(message);
}
答案 1 :(得分:1)
尝试通用,但T
应该扩展{}
。
export function getOrFail<T extends {}>(value: T | null | undefined, message: string = "getNumberOrFail error"): T {
if (value != null) return value;
throw new Error(message);
}
{}
允许除null或undefined之外的所有内容。
更多信息here。
答案 2 :(得分:1)
仅需注意另一种完整性的方法(不一定比其他方法更好),使用conditional s null
的{{3}}返回类型:
export const getOrFail = <T>(
value: T | null,
message: string = "getOrFail error"
) => {
if (value !== null) return value as Exclude<T, null>;
throw new Error(message);
};
并检查其行为:
const bool = getOrFail(true); // boolean
const nevr = getOrFail(null); // never
const undef = getOrFail(undefined); // undefined
const strng = getOrFail(Math.random() < 0.5 ? "hello" : null); // string
最后一个参数的类型为string | null
,返回类型为Exclude<string | null, null>
,或者仅为string
。