请考虑以下内容
type MergeFn = <K1 extends string, V1, K2 extends string, V2>(
k1: K1, v1: V1,
k2: K2, v2: V2
) => ???
let mergeFn: MergeFn // implementation not relevant to question
???
我需要填写什么,以便
mergeFn(
"hello", 1,
"typescript", 2
)
具有类型{ hello: number, typescript: number }
。
我尝试过
??? = { [k in K1]: V1 } & { [k in K2]: V2 }
但结果将是
{ hello: number } & { typescript: number }
。
(按照建议的here应用type Id<T> = { [k in keyof T]: T[k] }
也无济于事。)
答案 0 :(得分:1)
一种可行的方法是使用单个条件映射类型而不是交集:
Species statistic p.value estimate null.value alternative method data.name
1: setosa 5095.097 2.316710e-10 0.7553375 0 two.sided Spearman's rank correlation rho Sepal.Length and Sepal.Width
2: versicolor 10045.855 1.183863e-04 0.5176060 0 two.sided Spearman's rank correlation rho Sepal.Length and Sepal.Width
3: virginica 11942.793 2.010675e-03 0.4265165 0 two.sided Spearman's rank correlation rho Sepal.Length and Sepal.Width
产生
type MergeFn = <K1 extends string, V1, K2 extends string, V2>(
k1: K1, v1: V1,
k2: K2, v2: V2
) => { [K in K1 | K2]: K extends K1 ? V1 : V2}
当您说const test = mergeFn(
"hi", 4,
"there", 4
)
/* const test: {
hi: number;
there: number;
} */
“无济于事”时,我想您的意思是编译器决定向您显示诸如Id<T>
之类的类型别名,而不是为您扩展它。在这种情况下,我发现处理它的方法是通过一个中间条件类型,例如:
Id<A & B>
如果我在您的原始代码上使用它:
type Expand<T> = T extends infer U ? { [K in keyof U]: U[K] } : never
我得到相同的输出:
type MergeFn = <K1 extends string, V1, K2 extends string, V2>(
k1: K1, v1: V1,
k2: K2, v2: V2
) => Expand<Record<K1, V1> & Record<K2, V2>>
所以任何一种方法都应该对您有用。
好的,希望能有所帮助;祝你好运!