如何使返回类型以可选参数为条件

Posted

技术标签:

【中文标题】如何使返回类型以可选参数为条件【英文标题】:How to make return type conditional on optional param 【发布时间】:2022-01-23 21:56:49 【问题描述】:

所以我有这样的功能

export function myFunc<T>(dict: Record<string, T>, key: string, fallback?: T): ??? 
  const value = dict[key] as T | undefined;
  return value ?? fallback;

如果我调用 myFunc 并且如果通过了回退,那就太好了,它知道 undefined 不再是返回类型的可能性。比如

const x = myFunc<boolean>(, "hello") // should be typed as boolean | undefined

const y = myFunc<boolean>(, "hello", false) // should be typed as boolean only but is typed as boolean | undefined

现在,返回类型总是 T |未定义,即使我通过后备。有没有办法根据可选参数的存在来处理这种条件返回类型?

【问题讨论】:

【参考方案1】:

这是函数重载。所以我们可以定义我们的 2 个变体,其中 1 个定义了回退并将其键入为 T,而另一个没有明确定义回退。定义时返回 T,未定义时返回 T |不明确的。而且,一旦我们这样做了,您也应该能够删除 as T 演员表。

export function myFunc<T>(dict: Record<string, T>, key: string, fallback: T):T;
export function myFunc<T>(dict: Record<string, T>, key: string, fallback?: undefined):T | undefined;
export function myFunc<T>(dict: Record<string, T>, key: string, fallback?: T): T | undefined 
const value = dict[key] as T | undefined;
 return value ?? fallback;

【讨论】:

以上是关于如何使返回类型以可选参数为条件的主要内容,如果未能解决你的问题,请参考以下文章

Dart语法之可选参数

为具有更多限制性默认值的可选参数强制使用更广泛的类型

Python函数:函数的定义语法调用参数类型(必选参数缺省参数可选参数关键字可选参数)return返回值函数嵌套

如何使 URL 参数匹配可选[重复]

基于可选参数存在而不使用函数重载的打字稿函数返回类型

基于可选函数参数的不同返回类型 - Typescript