在编写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;
答案 0 :(得分:2)
所有的拳头,Action
可分配给ILoadUserBegin
let iaction1: ILoadUserBegin = anyaction; // ok
因此,它可以分配给包含ILoadUserBegin
作为其成员之一的联合类型也就不足为奇了。
下一个问题是为什么Action
类型的变量可以分配给ILoadUserBegin
?
由于Action
具有type
属性,因此声明为any
类型。
any
是一种与任何内容兼容的特殊类型,它会禁止类型检查,因此{type: any}
类型与{type: "LOAD_USER_BEGIN"}
类型兼容。