Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript TS是否可以根据第一个参数的类型来确定函数的第二个参数的类型_Typescript - Fatal编程技术网

Typescript TS是否可以根据第一个参数的类型来确定函数的第二个参数的类型

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

我正在研究一种简化redux设置的方法,我想知道是否可以这样做:

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无关。基于函数的第一个参数,我想知道第二个参数的类型。这正是我想要的:)谢谢!