Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.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中构建条件类型_Typescript_Typescript Typings - Fatal编程技术网

在Typescript中构建条件类型

在Typescript中构建条件类型,typescript,typescript-typings,Typescript,Typescript Typings,我正在尝试构建一个包含两个seq参数的curried函数。第一个是消息名,第二个是与特定消息相关的数据 我们有两种类型 type One = { name: "OneMessage"; data: { name: string; } } type Two = { name: "TwoMessage"; data: { lastName: string; } } genericFN=message=>data=>{message:message,da

我正在尝试构建一个包含两个seq参数的curried函数。第一个是消息名,第二个是与特定消息相关的数据

我们有两种类型

type One = {
  name: "OneMessage";
  data: {
     name: string;
  }
}

type Two = {
  name: "TwoMessage";
  data: {
     lastName: string;
  }
}
genericFN=message=>data=>{message:message,data:data}

当使用genericFN时,当我传递消息名时,让我们说 genericFNTwoMessage,它将返回一个函数,该函数将等待与该消息相关的特定数据,在本例中为{lastName:string}

我希望我能让自己明白

另外,对于那些能够清楚地看到我正在尝试做什么的人,请让我知道你将如何在头脑中处理这种情况,以想出解决方案


谢谢你们的时间。

这可能是你们想要做的

Payload接口是示例中1和2的常见类型

interface Payload<TName extends string> {
    name: TName;
    data: DataType<TName>;
}
最后一步是为genericFN函数指定类型

const genericFN = <TName extends string>(message: TName) =>
    (data: DataType<TName>): Payload<TName> =>
        ({ name: message, data });
现在,如果您声明一个函数具有类型GenericFunction,它将只接受类型为message one的参数

怎么样

type Messages = {
    OneMessage: {
        data: {
            name: string
        }
    }
    TwoMessage: {
        data: {
            name: string 
        }
    }
}


const getFunction = <Name extends keyof Messages>  (name:Name) => (data:Messages[Name]["data"]){
    console.log(data)
}
将返回一个接受

{name:string}

这是一种有趣的方法,尽管如何声明genericFN functionRenan还不清楚,请检查我的新答案。我相信这可能会提供一个解决方案。请让我知道。嗨,本,谢谢你的回答,它非常适合我的用例!你把这个作为被接受的答案,我们都得到了分数:-哈哈,我真的以为我点击了被接受而不是向上投票。很抱歉。
// Messge Types
type One = {
    readonly name: "OneMessage"
    data: {
        name: string,
    },
 }

type Two = DR<{
    readonly name: "TwoMessage";
    data: {
        lastName: string;
    }
 }>

type Message = One | Two

// Functions 
type GenericFunction<name extends Message["name"]> = (
     name extends One["name"]? GFun<One> : GFun<Two>
 )

type GFun <M extends Message> = (param:M) => unknown

type Messages = {
    OneMessage: {
        data: {
            name: string
        }
    }
    TwoMessage: {
        data: {
            name: string 
        }
    }
}


const getFunction = <Name extends keyof Messages>  (name:Name) => (data:Messages[Name]["data"]){
    console.log(data)
}
getFunction("OneMessage")
{name:string}