如何使useWatchProps回调函数参数与第一个参数相对应
type KeysToValues<O extends Record<string, any>, K> = K extends [
infer G,
...infer L
]
? G extends keyof O
? [O[G], ...KeysToValues<O, L>]
: []
: []
function useWatchProps<
O extends Record<string, any>,
K extends keyof O = keyof O,
T extends K | K[] = K | K[]
>(
keys: T,
callback: (values: T extends K ? O[K] : KeysToValues<O, K>) => void
) {}
useWatchProps<{ a: number; b: string }>('a', (a) => {
a // number
})
useWatchProps<{ a: number; b: string }>(['a', 'b'], ([a, b]) => {
a // number
b // string
})
如何通过关键点约束T
1条答案
按热度按时间dgjrabp21#
由于您没有传递
T
,它会自动转换为您指定的默认值。不幸的是,我们不能只指定所需参数的一部分;因此,我可以建议让useWatchProps
只接受O
并返回另一个函数。用法如下所示:我们还需要将
T
更改为const类型参数,以避免编译器将T
转换为并集。这将导致T
的所有检查变为readonly some_array/some_tuple
。修改:
实施:
用途:
Playground