Javascript 如何根据另一个道具键入对象的道具';s型?

Javascript 如何根据另一个道具键入对象的道具';s型?,javascript,typescript,types,Javascript,Typescript,Types,考虑下一个例子: 枚举操作类型{ A=‘A’, B='B' } 类型ActionProps={ [ActionTypes.A]:{ a:字符串 } [ActionTypes.B]:{ b:字符串 } } 类型操作={ [输入动作道具的键]:{ 类型:类型 }&ActionProps[类型] } //产生预期的结果,但不适合此情况 常量状态1:操作[ActionTypes]={ 类型:ActionTypes.A, a:'字符串', }; (() => { if(state1.type==Actio

考虑下一个例子:

枚举操作类型{
A=‘A’,
B='B'
}
类型ActionProps={
[ActionTypes.A]:{
a:字符串
}
[ActionTypes.B]:{
b:字符串
}
}
类型操作={
[输入动作道具的键]:{
类型:类型
}&ActionProps[类型]
}
//产生预期的结果,但不适合此情况
常量状态1:操作[ActionTypes]={
类型:ActionTypes.A,
a:'字符串',
};
(() => {
if(state1.type==ActionTypes.A){
state1.a='anotherstring';
//不会出错,因为编译器知道
//按state.type列出的可能属性
}
})();
//不会产生预期的结果,但对于这种情况来说是理想的
类型状态={
类型:ActionType
actionProps:actionProps[状态['type']]
}
常量state2:状态={
类型:ActionTypes.A,
行动道具:{
a:'字符串',
b:'字符串',
}
};
(() => {
if(state2.type==ActionTypes.A){
state2.actionProps.a='anotherstring';
//错误-类型{b:string;}上不存在属性“a”
}
})();

预期的结果是,如果编译器知道
state.type===ActionTypes.A
,那么它知道
state.actionProps
的类型是
actionProps[ActionTypes.A]


有任何可能的解决方法吗?

您可能正在寻找一种通用的:

enum ActionTypes {
    A = 'A',
    B = 'B'
}

type ActionProps = {
    [ActionTypes.A]: {
        a: string
    }
    [ActionTypes.B]: {
        b: string
    }
}

type State<Type extends keyof ActionProps> = {
    type: Type
    actionProps: ActionProps[Type] & ActionProps[keyof ActionProps]
}

const state: State<ActionTypes.A> = {
    type: ActionTypes.A,
    actionProps: {
        a: 'string',
        b: 'string',
    }
};

(() => {
    if (state.type === ActionTypes.A) {
        state.actionProps.a = 'anotherstring';
        //errors - Property 'a' does not exist on type '{ b: string; }'
    }
})();
枚举操作类型{
A=‘A’,
B='B'
}
类型ActionProps={
[ActionTypes.A]:{
a:字符串
}
[ActionTypes.B]:{
b:字符串
}
}
类型状态={
类型:类型
actionProps:actionProps[Type]&actionProps[keyof actionProps]
}
const state:state.

我不理解“产生了预期的结果,但不适合这种情况”。为什么不理想?如果希望基于控制流进行这种缩小,则需要一个有区别的联合,而
Action[keyof ActionProps]
正是正确的类型。那么,有什么不适合你呢?