我可以在对象中使用通用类型作为键名吗?

时间:2019-10-14 11:14:32

标签: typescript

我有一个要作为接口返回的函数,该函数的通用参数决定了键名和值的类型。

我想防止(或至少最小化)调用代码或“ DRY”中的重复次数。

每次尝试将通用类型用作对象键都会导致错误,例如“ K仅引用类型,但在此处被用作值。”,这是可以理解的,因为这正是打字稿的工作方式。但是我还是想这样做:)

这是到目前为止我得到的:

function foo<K extends string, V>(name: K): Partial<{ [key in K]: V; }> {
  return { [name]: undefined } as Partial<{ [key in K]: V; }>;
}

这有效,可以这样称呼:

foo<'bar', number>('bar');

看看有没有必要两次通过'bar'才能完成这项工作?这就是我要解决的问题。

现在,当'bar'出现的字符串与另一个字符串不同时,打字稿将抛出错误,因此可以保证正常工作。但这不是重点。关键是,从调用者的角度来看,必须将字符串传递两次,并且字符串必须相同,这将使您感到随意,并且不需要。

因此,我很希望能够将其重写为如下形式:

function foo<K extends string, V>(): Partial<{ [key in K]: V; }> {
  return { [K]: undefined } as Partial<{ [key in K]: V; }>;
}
foo<'bar', number>();

现在它给出了我提到的错误。这个想法是因为编译器要求nameK相同,所以我应该可以省去name并改用K。但不幸的是,正如我所说,那不是打字稿的工作原理。

这也是一个可行的选择:

function foo<V, K extends string>(name: K): Partial<{ [key in K]: V; }> {
  return { [name]: undefined } as Partial<{ [key in K]: V; }>;
}
foo<number>('bar');

这里的想法是忽略K,因为可以从给定的name参数中推断出它。但是a,这不是打字稿的工作原理,它告诉我该函数需要2个通用参数。因此,我认为这种类型的推断是不可能的。

问题是,怎么做我如何解决,最好没有编译器错误:)

1 个答案:

答案 0 :(得分:0)

您可以考虑使用咖喱粉。

示例:

> ab <- split(replicate(10, sample(15,2)), seq(2))
> a <- ab[[1]]
> b <- ab[[2]]
> a
 [1] 14  7 10  8  2  6  6  8 13 12
> b
 [1]  5  5  4 11 13 12  5 13  6 14
> duplicated(a)
 [1] FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE FALSE FALSE
> duplicated(b)
 [1] FALSE  TRUE FALSE FALSE FALSE FALSE  TRUE  TRUE FALSE FALSE