我正在尝试在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,所以我认为我应该先在这里检查。
答案 0 :(得分:0)
要使与有区别的联合相关联的类型防护工作,您不能破坏联合。如果这样做,Typescript将无法跟踪销毁的变量以任何方式相关。这将起作用:
export default (state = defaultState, a : Action) : State => {
switch(a.type) {
case 'PASSWORD/OPEN':
return { ...state, open: a.payload }
}
}