我有一个存储键和回调函数的对象。这些回调函数可以有1个参数,也可以没有参数(未定义)。
最小示例:
const foo = {
a: (arg: string) => null,
b: () => null,
}
type keys = keyof typeof foo
type FirstArgument<Key extends keys> = Parameters<(typeof foo)[Key]>[0]
function testing<T extends keys>(key: T, arg?: FirstArgument<T>) {
foo[key](arg)
}
testing('a', 'bar') // No error => correct
testing('a', 5) // Error => correct
testing('b') // No error > correct
testing('b', 'baz') // Error => correct, 'baz' is not assignable to type undefined
testing('a') // No error, even though FirstArgument<T> is string
我知道可选参数的| undefined
部分使得这是完全可以预料到的结果。但是有什么方法可以实现我所寻找的结果吗?我尝试过重载函数和扩展参数,但两者都没有改变行为。
1条答案
按热度按时间wsxa1bj11#
您可以使用带有conditionaltuple类型的rest参数来创建所需的函数签名:
TSPlayground