Typescript 接口的keyof和valueof的匹配对

Typescript 接口的keyof和valueof的匹配对,typescript,Typescript,我有这样一个界面: interface ISession { emailAddress: string; me: IUser | null; groups: IGroup[] | null; } 我想用以下伪代码创建一个对象: type SetAction = { type: typeof SET, key: K in keyof ISession, value: V in valueof ISession }; 此伪代码的问题在于它不能确保值

我有这样一个界面:

interface ISession {
    emailAddress: string;
    me: IUser | null;
    groups: IGroup[] | null;
}
我想用以下伪代码创建一个对象:

type SetAction = {
    type: typeof SET,
    key: K in keyof ISession,
    value: V in valueof ISession
};
此伪代码的问题在于它不能确保值类型与
ISession[k]
的值匹配

这在TS中可能吗


我遇到了一个类似的问题,这不是问题的一部分,但可能是为了帮助别人思考,因为我觉得解决方法是一样的。我需要编写一个函数
函数集(键、值)
。其中
是适当的匹配对。

您可以创建这样的类型,但您要做的是创建所有可能的
/
组合的并集。因此,我们要创建的类型是:

type SetAction  = 
    { type: typeof SET, key: 'emailAddress', value: string; } |
    { type: typeof SET, key: 'me', value:  IUser | null; } |
    { type: typeof SET, key: 'groups', value: IGroup[] | null; }
我们可以通过使用

或者使用映射类型更容易理解的Perphap版本(结果相同):


天哪,我发布这篇文章的初衷是认为这是不可能的。但这在几分钟内就得到了回答,这是可能的。这真的很酷!Stackoverflow阻止我再接受你的回答4分钟,我很快会接受的。这是一个非常棒的学习,我将尝试将其应用于函数参数,你认为同样的技术也适用吗?@Noitidart取决于你正在尝试做什么,如果你有示例代码,发布另一个问题,我通常也一样快;)感谢提提如此快速的回复,以及对解决方案的编辑,这对于学习来说太棒了!我试图创建一个将此技术应用于这个伪代码
函数集(key:K in keyof ISession,value:ISession[K]):SetAction
@Noitidart您只需要在那里使用一个类型参数
函数集(key:K,value:ISession[K]):SetAction
。对于类型,我们需要说明所有的可能性,因为如果我们指定变量的类型,就不会发生任何推断。另一方面,如果我们有一个函数可以使用,我们可以做更多的事情,因为类型参数需要推理
type SetAction = keyof ISession extends infer K ? // introduce type parameter 
    K extends keyof ISession ? // distribute over the type parameter 
        { type: typeof SET, key: K, value: ISession[K]; } // The type that we construct for each K
    : never: never
type SetAction = {
    [K in keyof ISession]-?: { type: typeof SET, key: K, value: ISession[K]; } 
}[keyof ISession]