函数 return 类型基于作为参数传递的数组元素

Function return type based on the elements of array passed as an argument

我正在尝试找到一种方法来创建 return 类型取决于作为参数传递的数组元素的函数

const arr1 = ['a', 'b'] as const
const arr2 = ['a', 'c'] as const

func(arr1)     // return type {a: any, b: any}
func(arr1).a   // ok
func(arr1).b   // ok
func(arr1).c   // TYPE ERROR

func(arr2)     // return type {a: any, c: any}
func(arr2).a   // ok
func(arr2).b   // TYPE ERROR
func(arr2).c   // ok

类似的东西但实际上有效

function func<T>(array: T): {[K in typeof array[number]]: any}

太近了!

function func<A extends ReadonlyArray<string>>(array: A): { [K in A[number]]: any } { ... }

A[number] 将为我们提供其中所有字符串的并集,然后我们可以对其进行映射。

您可以将此处的泛型视为将 array 的类型“保留”到 return 类型,以便我们可以使用它。

Playground