我想向用户介绍通过键获取值的更好的API.其思想是允许将键作为数组传递或作为列逐个传递.例如:

mget('key1', 'key2', 'key3');
mget(['key1', 'key2', 'key3']);

我try 的实现,实际上大部分时间都是有效的

async mget(...keys: string[]): Promise<StorageValue>;
async mget(keys: string[]): Promise<StorageValue>;
@requireStorage
async mget(firstArg: string | string[], ...rest: string[]): Promise<Array<StorageValue>> {
  const keys = Array.isArray(firstArg) ? firstArg : Array(firstArg, ...rest);
  // do something with keys
}

但问题是当函数调用时没有任何键,比如mget(),所以我得到keys===[undefined],因为firstArg没有定义,所以它用undefined参数创建新的array.

虽然我可以修复它,但它变得更难看,更容易出错.我感兴趣的是有一种更好更简单的方法来实现如此容易的重载,而这在TS中根本不是那么容易的.

推荐答案

我觉得你能做的就是

@requireStorage
function mget(...args: [string[]] | string[]): Promise<Array<StorageValue>>
  ...
}

Args数组包含单个字符串数组或多个字符串.

这是一张Playground美元的钞票

Typescript相关问答推荐

如何在ts中使用函数重载推断参数类型

VS代码1.88.0中未出现自动导入建议

类型{...}的TypeScript参数不能赋给类型为never的参数''

为什么tsx不判断名称中有"—"的属性?'

角效用函数的类型推断

如果数组使用Reaction-Hook-Form更改,则重新呈现表单

在打印脚本中使用泛型扩展抽象类

保护函数调用,以便深度嵌套的对象具有必须与同级属性函数cargument的类型匹配的键

如何从MAT-FORM-FIELD-MAT-SELECT中移除焦点?

如何在省略一个参数的情况下从函数类型中提取参数类型?

无法将从服务器接收的JSON对象转换为所需的类型,因此可以分析数据

TYPE FOR ARRAY,其中每个泛型元素是单独的键类型对,然后在该数组上循环

有没有办法在Zod中使用跨字段验证来判断其他字段,然后呈现条件

在组件卸载时try 使用useEffect清除状态时发生冲突.react +打字

S,为什么我的T扩展未定义的条件在属性的上下文中不起作用?

Typescript将键数组映射到属性数组

打印脚本中正则函数和函数表达式的不同类型缩小行为

如何使函数参数数组不相交?

组件使用forwardRef类型脚本时传递props

如何在Vuetify 3中导入TypeScript类型?