为什么添加类型联合使其可以分配给AnyAction

时间:2018-04-05 01:52:39

标签: typescript redux

在编写redux代码时,我偶然发现了我不理解的类型行为。

在下面的代码中,您无法将anyaction分配给iaction。但由于某些原因,将anyaction分配给iaction2很好。我正在尝试在此处应用“Assignment Compatibility”部分规范,但无法解释这种差异。

发生了什么事?显然,存在AnyAction类型的值,这些值不能分配给IAction2

export interface ILoadUserBegin {
    type: "LOAD_USER_BEGIN";
}

export interface ILoadUserSuccess {
    type: "LOAD_USER_SUCCESS";
    response: number;
}

type IAction = ILoadUserSuccess;
type IAction2 = ILoadUserBegin | ILoadUserSuccess;

// these are redux types

interface Action {
  type: any;
}

interface AnyAction extends Action {
  [extraProps: string]: any;
}

// tests

let iaction: IAction = { type: "LOAD_USER_SUCCESS", response: 2 };
let iaction2: IAction2 = { type: "LOAD_USER_BEGIN" };
let anyaction: AnyAction = { type: "foo" };

// ERROR
// Type 'AnyAction' is not assignable to type 'ILoadUserSuccess'.
// Property 'response' is missing in type 'AnyAction'.
iaction = anyaction;  

// But this is OK!
iaction2 = anyaction;

1 个答案:

答案 0 :(得分:2)

所有的拳头,Action可分配给ILoadUserBegin

let iaction1: ILoadUserBegin = anyaction;  // ok

因此,它可以分配给包含ILoadUserBegin作为其成员之一的联合类型也就不足为奇了。

下一个问题是为什么Action类型的变量可以分配给ILoadUserBegin

由于Action具有type属性,因此声明为any类型。

any是一种与任何内容兼容的特殊类型,它会禁止类型检查,因此{type: any}类型与{type: "LOAD_USER_BEGIN"}类型兼容。