如何基于打字稿中的数组定义映射类型?

时间:2019-10-03 09:34:14

标签: typescript

是否可以定义此功能

function magic(...propertyNames:string[]): { ????? : any }
{
....
}

在这种情况下,返回的类型将具有 propetyNames 中列出的属性?

例如:

type ResultType = {alpha:any, bravo:any};

let res = magic('alpha', 'bravo'); // res is compatible with ResultType

1 个答案:

答案 0 :(得分:1)

以下是可能导致magic发生的解决方案:

declare function magic<T extends string[]>(
  ...propertyNames: T
): Record<T[number], any>;

const result = magic("alpha", "bravo");

type ResultType = typeof result; // {alpha: any; bravo: any;}

测试ResultType

const t1: ResultType = {
  alpha: "foo",
  bravo: 42,
  wannaBe: 3 // error (OK)
};

然后您可以通过附加的类型参数进一步限制any中的Record<T[number] any>类型,因为any不提供任何有用的类型。

declare function magic<T extends string[], R>(
  ...propertyNames: T
): Record<T[number], R>;

一些解释

  • T[number]为我们提供了所有项目值作为联合类型。例如。
type T = ["alpha", "bravo"]
type TItems = T[number] // "alpha" | "bravo"
  • Record确保将所有项值"alpha" | "bravo"作为属性键。
  • 可以在generic rest parameters的帮助下推断元组类型。

Playground