【发布时间】:2021-10-24 09:47:00
【问题描述】:
我有一个这样的对象数组
const barDependency = {
defaults: {
size: {
bar: {
foo: 12,
bar: {
default: 12,
active: 12
}
}
},
color: {}
}
}
还有一个像这样的原始对象:
const theme = {
size: {
m: '12px'
}
}
应该合并两者的函数应该将barDependency.defaults.size中的所有内容放入theme.size.components中
这个函数的逻辑很简单,但是 TS 无法推断输出,所以我决定自己用 TS mapped types 声明 ReturnType,如下所示:
const stitchTheme = <
T extends RawTheme,
D extends ThemeDependency[] = ThemeDependency[],
A extends number = number
>(
dependencies: D,
options?: StitchThemeOptions
): T & {
size: T['size'] & {
components?: {
[Key in KeysOfUnion<
D[A]['defaults']['size']
>]: D[A]['defaults']['size'][Key]
}
}
}
问题是即使泛型指向相同的数字,我也无法通过数组中的索引访问给定对象的值。 size.components.bar 的值将是 unknown。
有没有办法正确解决这个问题?
KeysOfUnion 类型供参考type KeysOfUnion<T> = T extends T ? keyof T : never
【问题讨论】:
标签: typescript types mapped-types