我需要存储多个不同的函数,这些函数在该参数的自变量旁边都有一个参数.
我已经能够让它工作,并一次对一种类型的函数进行类型判断,但我希望能够一次传递多个不同类型的函数,并对该函数的参数进行正确的类型判断.
type WalkOptions = {
x: number
speed: number
}
type JumpOptions = {
y: number
speed: number
}
type ShootOptions = {
type: string
duration: number
}
const walk = (options: WalkOptions)=>{}
const jump = (options: JumpOptions)=>{}
const shoot = (options: ShootOptions)=>{}
type Action<T extends (options: any) => void> = {
command: T
args: Parameters<T>[0]
}
function add<T extends (options: any) => void>(...actions: Action<T>[]){}
使用上面的代码,我可以做add({command: walk, args:{x: 10, speed: 1}})
,我会得到正确的类型判断args.我也可以做add({command: walk, args:{x: 10, speed: 1}}, {command: walk, args:{x: -10, speed: 2}})
,一切都很好.
然而,如果我做add({command: walk, args:{x: 10, speed: 1}}, {command: jump, args:{x: 5, speed: 1}})
,我会在command: jump
上得到一个类型错误,因为它应该是(options: WalkOptions) => void
.
有没有什么我可以做的,这样我就可以像这样使用Add,并且仍然可以对与它一起使用的命令的参数进行类型判断.
add({
command: walk,
args:{
x: 10,
speed: 1
}
},
{
command: jump,
args:{
y: 5,
speed: 1
}
},
{
command: shoot,
args:{
type: "laser",
duration: 3
}
},
{
command: walk,
args:{
x: -10,
speed: 2
}
})
另外,是否可以使用类型判断来创建这些操作的数组,以便在Add Like add(...actionArray)
上使用