我有一个简单的函数,可以接受一个类型为T的对象或一个类型为T[]的对象array.然后它将执行它的任务并返回一个与传入类型匹配的结果(即,如果传入一个数组,则返回一个结果数组,如果传入单个项,则返回单个结果).

翻译后的JS功能完全如预期的那样,但是类型系统坚持将数组嵌套在泛型中,我不知道为什么或者如何确保它解析为我想要的.

Example Function

type OneOrMany<T> = T | T[]
type Item = Record<string, any>
type CapitalizedProps<T extends Item> = {
  [K in keyof T as Capitalize<K & string>]: T[K]
}

function toCapitalizedProps<T extends Item>(item: T): CapitalizedProps<T>
function toCapitalizedProps<T extends Item>(items: T[]): CapitalizedProps<T>[]
function toCapitalizedProps<T extends Item>(
  itemOrItems: OneOrMany<T>,
): OneOrMany<CapitalizedProps<T>> {
  if (Array.isArray(itemOrItems)) {
    return itemOrItems.map((item) =>
      toCapitalizedProps(item),
    ) as CapitalizedProps<T>[]
  }

  const result = { ...itemOrItems }

  for (const key in result) {
    result[(key[0].toUpperCase() + key.slice(1)) as keyof T] = result[key]
    delete result[key]
  }

  return result as unknown as CapitalizedProps<T>
}

推荐答案

函数重载使用first匹配.

function toCapitalizedProps<T extends Item>(item: T): CapitalizedProps<T>
function toCapitalizedProps<T extends Item>(items: T[]): CapitalizedProps<T>[]

事实证明,数组符合Item约束Record<string, any>,因为数组的字符串属性都有可分配给any的值.

const test: Record<string, any> = [] as string[] // fine

因此,当你传递一个数组时,使用第一个重载,它推断T作为数组类型.


如果你交换顺序,那么首先会判断需要作为数组的重载,如果它是数组,则会使用它.如果没有,它将进入下一个.

function toCapitalizedProps<T extends Item>(items: T[]): CapitalizedProps<T>[]
function toCapitalizedProps<T extends Item>(item: T): CapitalizedProps<T>

See playground

Typescript相关问答推荐

将对象属性路径描述为字符串数组的类型

类型脚本如何将嵌套的通用类型展开为父通用类型

TypScript手册中的never[]参数类型是什么意思?

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

带有联合参数的静态大小数组

用泛型类型覆盖父类函数导致类型y中的Property x不能赋给基类型Parent中的相同属性."'''''' "

未在DIST中正确编译TypeScrip src模块导入

仅针对某些状态代码重试HTTP请求

类型脚本基于数组作为泛型参数展开类型

如何在深度嵌套的Reaction路由对象中隐藏父级?

是否可以判断某个类型是否已合并为内部类型?

以Angular 执行其他组件的函数

有没有可能创建一种类型,强制在TypeScrip中返回`tyPeof`语句?

如何在脚本中输入具有不同数量的泛型类型变量的函数?

如何从对象或类动态生成类型

对有效枚举值的常量字符串进行常规判断

任何导航器都未处理有效负载为";params";:{";roomId";:";...";}}的导航操作

如何强制对象数组中的对象属性具有非空字符串值?

是否可以从 TypeScript 的类型推断中排除this?

如何在 ngFor 循环中以Angular 正确动态渲染组件