Redux的Reducer <>类型不能正确地将返回类型传递给reducer吗?

时间:2019-03-05 18:51:30

标签: typescript redux

信息: 在Jetbrains Rider中使用打字稿3.3.3333

给出Reducer<State, Action>的这种类型的定义:

* @template S The type of state consumed and produced by this reducer.
* @template A The type of actions the reducer can potentially respond to.
*/
export type Reducer<S = any, A extends Action = AnyAction> = (
  state: S | undefined,
  action: A
) => S

为什么除非我明确定义了S的返回类型,否则不检查我从化简器返回的状态?

export const INITIAL_STATE: AuthenticationState = {
    authenticationInProgress: false,
    accessToken: null,
    tokenType: null,
    expiryTimeMs: null,
    errorInformation: null,
    isAdmin: false,
};

export const authenticationReducer: Reducer<AuthenticationState, 
    AuthenticationActions> = (state = INITIAL_STATE, action): 
(why is this necessary??) ->  AuthenticationState => {
        switch (action.type) {
            case "authentication/user_authentication_request": {
                return {
                    ...state,
    problem -> hello: "hi",
                    authenticationInProgress: true,
                };
            }
...

我期望的行为而无需将AuthenticationState定义为返回值 Behavior I expect without needing to define AuthenticationState as the return value

VS。

如果Reducer Type包含S的返回值,为什么不再对返回值进行类型检查? Why is there no more type checking for the return value is the Reducer<S, A> Type includes the return value of S

任何欢迎我们的光和智慧。预先感谢。

2 个答案:

答案 0 :(得分:1)

TLDR :由于多余的属性检查的工作方式,这是TypeScript中的预期行为。

在您的情况下,您定义的箭头函数的返回类型具有多余(或多余)的属性。对于TypeScript,这完全可以。

在一个简化的示例中,请看一下这种行为:

type a = () => { a: string };
type b = () => { a: string, b: string };

declare let myA: a;
declare let myB: b;

myA = myB; // OK! (excess properties are not checked)
myB = myA; // Error: missing required property 'b'

问题的症结在于,您实际上是将myB分配给myA并期望出现错误,但是只有将myA分配给{{ 1}}。

您有几种选择可以使您的代码按预期工作(例如您所建议的那种,您在其中明确定义了返回类型),但是在TypeScript支持确切类型之前,它们都不是理想的选择(对于确切类型,有an open issue,讨论了带redux的确切用例和一些解决方法)。

答案 1 :(得分:0)

正如Christian Santos所述,这是预期的行为。

如果您希望获得类型安全的Redux体验, 那么我建议您看看一些专门针对此设计的redux扩展!

签出redux-fluent

enter image description here enter image description here