我有一个接口Action
interface Action {}和这个Action SpecificAction的实现
class SpecificAction implements Action {
payload?: Any
}在TS中是否可以构造一个开关运算符,如下所示:
let action: Action
switch (action) {
case SpecificAction: //it works
console.log(action.payload) // it doesn't
}在这种情况下,有可能知道该操作已经是SpecificAction类型的吗?
发布于 2019-06-14 19:58:43
就目前而言,似乎有几种选择,所有这些选择都有一些缺点
鉴别器
interface Action {}
class SpecificAction implements Action {
kind: "specific";
payload?: any;
}
class ToggleAction implements Action {
kind: "toggle";
toggle: boolean;
}
let action: SpecificAction | ToggleAction;
switch (action.kind) {
case "specific":
console.log(action.payload) // it works
break;
case "toggle":
console.log(action.toggle) // it works
break;
}interface Action {}
class SpecificAction implements Action {
payload?: any;
}
class ToggleAction implements Action {
toggle: boolean;
}
let isSpecific = (p: any): p is SpecificAction => !!p.payload
let isToggle = (p: any): p is ToggleAction => !!p.toggle
let action: Action;
if (isSpecific(action)) {
console.log(action.payload) // it works
} else if (isToggle(action)) {
console.log(action.toggle) // it works
}所需的类型
interface Action { }
class SpecificAction implements Action {
payload?: any;
}
class ToggleAction implements Action {
toggle: boolean;
}
switch (action.constructor) {
case SpecificAction:
console.log((<SpecificAction>action).payload) // it kinda works
break;
case ToggleAction:
console.log((<ToggleAction>action).toggle) // it kinda works
break;
}https://stackoverflow.com/questions/50774790
复制相似问题