我有一个要作为接口返回的函数,该函数的通用参数决定了键名和值的类型。
我想防止(或至少最小化)调用代码或“ 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>();
现在它给出了我提到的错误。这个想法是因为编译器要求name
和K
相同,所以我应该可以省去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个通用参数。因此,我认为这种类型的推断是不可能的。
问题是,怎么做我如何解决,最好没有编译器错误:)
答案 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