`zip` 和 `zipObj` 函数的 TypeScript 定义

问题描述 投票:0回答:1

可能没有必要,但我一直在思考如何概括或提取/扩展/重用这些类似类型定义的部分,因为我发现它们读起来很混乱。

const zip = <T, K>(arr1: readonly T[], arr2: readonly K[]): Array<[T, K]> => arr1.map((k, i) => [k, arr2[i]])

const zipObj = <T extends string, K>(arr1: readonly T[], arr2: readonly K[]): { [key: string]: K} => 
  Object.fromEntries(zip(arr1, arr2))

// usage
const names = ['bob', 'sally', 'dave'] as const
const ages = [50, 40, 30] as const

const myEntries = zip(names, ages) // [['bob', 50], ['sally', 40], ['dave', 30]]
const myObj = zipObj(names, ages) // { 'bob': 50, 'sally': 40, 'dave': 30 }
  • 两者都采用两个数组作为参数
  • zipObj
    要求
    T
    是有效的键(因此
    T extends string
    T extends string | number | symbol
  • 返回类型不同

理想情况下,我希望能够将其提取到一个单独的定义中。我可以轻松做到:

type ZipFunction = <T, K>(arr1: readonly T[], arr2: readonly K[]) => Array<[T, K]>

但是我不确定从这里到哪里去覆盖

T
ZipObjFunction
的返回类型。

javascript typescript types
1个回答
0
投票

你可以尝试:

type ZipObjectFunction = <T, K>(arr1: readonly T[], arr2: readonly K[]) => Object.fromEntries<Array<[T, K]>>

这能解决问题吗?

© www.soinside.com 2019 - 2024. All rights reserved.