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

时间:2018-09-06 18:54:22

标签: typescript visual-studio-code

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

  
    

[ts]键入'boolean | {open:boolean; }”不可分配给“ boolean”类型。       输入'{open:boolean; }”不可分配为“ boolean”类型。

  

右下角报告的打字稿版本为Typescript 3.0,这是我在项目中使用的版本。如果我正确理解打字稿,它应该根据我的类型值进行区分,并正确推断出我的有效载荷是什么类型。从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
  }
}

actions / index.ts

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

actions / password.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},
});

免责声明

这可能与编程没有直接关系,因此可能不在主题之列。我打算先在他们的GitHub页面上发布问题,但是问题清单说要在这里提问。由于我不能100%地确定这是一个bug,所以我认为我应该先在这里检查。

1 个答案:

答案 0 :(得分:0)

要使与有区别的联合相关联的类型防护工作,您不能破坏联合。如果这样做,Typescript将无法跟踪销毁的变量以任何方式相关。这将起作用:

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