Typescript TS是否可以根据第一个参数的类型来确定函数的第二个参数的类型
我正在研究一种简化redux设置的方法,我想知道是否可以这样做:Typescript TS是否可以根据第一个参数的类型来确定函数的第二个参数的类型,typescript,Typescript,我正在研究一种简化redux设置的方法,我想知道是否可以这样做: type Action = {type: "foo", payload: string} | {type: "bar", payload: number} | {type: "baz"} function Test<T extends Action>(action: T['type'], payload?: T['payload']) { retur
type Action = {type: "foo", payload: string} | {type: "bar", payload: number} | {type: "baz"}
function Test<T extends Action>(action: T['type'], payload?: T['payload']) {
return
}
Test("foo", "string")
Test("bar", 1337)
Test("baz")
type Action={type:“foo”,有效载荷:string}{type:“bar”,有效载荷:number}{type:“baz”}
功能测试(操作:T['type'],有效载荷?:T['payload']){
返回
}
测试(“foo”,“string”)
测试(“bar”,1337)
测试(“baz”)
其思想是,如果您键入“foo”作为第一个参数,那么只允许字符串作为第二个参数,“bar”作为第一个参数,只允许数字和“baz”作为第一个参数,那么第二个参数应该是空的。有点复杂,但它可以工作
interface ActionWithPayloadDefinition {
foo: string,
bar: number
complex: {
name: string
age: number
}
}
type ActionWithPayloadName = keyof ActionWithPayloadDefinition
type ActionWithoutPayloadName = 'baz'
// Use function overload: https://www.typescriptlang.org/docs/handbook/2/functions.html#function-overloads
function Test<T extends ActionWithoutPayloadName>(type: T): void
function Test<T extends ActionWithPayloadName>(type: T, payload: ActionWithPayloadDefinition[T]): void
function Test(type: string, payload?: any){
// Do something
}
Test("foo", "string")
Test("bar", 1337)
Test("baz")
Test("complex", { name: 'testing', age: 999 })
与PayloadDefinition的接口操作{
傅:字符串,
酒吧:号码
复杂:{
名称:string
年龄:数目
}
}
键入ActionWithPayloadName=keyof ActionWithPayloadDefinition
键入ActionWithoutPayloadName='baz'
//使用函数重载:https://www.typescriptlang.org/docs/handbook/2/functions.html#function-超载
功能测试(类型:T):无效
功能测试(类型:T,有效载荷:ActionWithPayloadDefinition[T]):无效
功能测试(类型:字符串,有效负载?:任何){
//做点什么
}
测试(“foo”,“string”)
测试(“bar”,1337)
测试(“baz”)
测试(“复杂,{name:'testing',年龄:999})
我介绍了一个ActionWithPayloadDefinition
接口,我们使用该接口将操作的名称映射到有效负载的类型。我在这里添加了一个complex
类型,以证明我们可以拥有更复杂的有效载荷
在Test
函数中,我们不使用完整的Action
作为通用参数,而只使用Action名称作为通用参数。这允许我们使用该参数将其映射回预期的有效负载类型
有点遗漏了这个问题的“真实主题”,但我真的可以建议您查看官方的Redux工具包,因为它实际上是面向打字脚本的,您将不再手工编写动作类型(无论是字符串还是打字脚本类型)或动作创建者之类的内容。也遗漏了“真实主题”,但还有,它为你做了很多这方面的工作。它实际上与redux无关。基于函数的第一个参数,我想知道第二个参数的类型。这正是我想要的:)谢谢!