返回类型为非空且基于输入类型

时间:2019-09-05 20:04:31

标签: typescript

我很好奇是否有一个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

我该如何定义上面的功能?

3 个答案:

答案 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);
}

Playground

如@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

Exclude