代码之家  ›  专栏  ›  技术社区  ›  richbai90

带标记的联合类型上的Visual Studio代码错误

  •  1
  • richbai90  · 技术社区  · 7 年前

    我正在尝试在redux应用程序中为我的动作创建者实现一个标记的联合类型模式。ts编译没有问题,但是我的IDE, Visual Studio Code 1.26.1 给了我一个错误。

    [ts]类型'boolean |{open:boolean;}'不能赋值给类型'boolean'。

    右下角报告的typescript版本是 Typescript 3.0 这是我在项目中使用的版本。如果我正确地理解了typescript,它应该根据我的类型值进行区分,并正确地推断出我的负载将是什么类型。同样,这似乎是从ts的角度工作,但它是恼人的vs代码给我带来麻烦。

    减速机

    import { Action } from '../actions';
    
    interface State {
      open: boolean;
    };
    
    const defaultState : State = {
      open: false,
    };
    
    export default (state = defaultState, { type, payload } : Action) : State => {
      switch(type) {
        case 'PASSWORD/OPEN':
          return { ...state, open: payload } // ERROR here on open property
      }
    }
    

    行动/索引.ts

    import { PasswordAction, openPassword, closePassword } from './password';
    export type Action = PasswordAction;
    export default {
      openPassword,
      closePassword,
    };
    

    行动/密码.ts

    interface OpenAction {
      type: 'PASSWORD/OPEN';
      payload: boolean;
    }
    
    interface CloseAction {
      type: 'PASSWORD/CLOSE';
      payload: { open: boolean; };
    }
    
    export type PasswordAction = OpenAction | CloseAction;
    
    export const openPassword = () : OpenAction => ({
      type: 'PASSWORD/OPEN',
      payload: true,
    });
    
    export const closePassword = () : CloseAction => ({
      type: 'PASSWORD/CLOSE',
      payload: {open: false},
    });
    

    免责声明

    1 回复  |  直到 7 年前
        1
  •  0
  •   Titian Cernicova-Dragomir    7 年前

    要使与受歧视的联合相关联的类型保护起作用,您不能破坏联合的结构。如果这样做,Typescript将无法跟踪被破坏的变量是否以任何方式相关。这将起作用:

    export default (state = defaultState, a : Action) : State => {
      switch(a.type) {
        case 'PASSWORD/OPEN':
          return { ...state, open: a.payload }
      }
    }