首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TypeScript中特定类型的开关

TypeScript中特定类型的开关
EN

Stack Overflow用户
提问于 2018-06-09 21:29:01
回答 1查看 40.4K关注 0票数 40

我有一个接口Action

代码语言:javascript
复制
interface Action {}

和这个Action SpecificAction的实现

代码语言:javascript
复制
class SpecificAction implements Action {
   payload?: Any
}

在TS中是否可以构造一个开关运算符,如下所示:

代码语言:javascript
复制
let action: Action
switch (action) {
   case SpecificAction: //it works
       console.log(action.payload) // it doesn't 
}

在这种情况下,有可能知道该操作已经是SpecificAction类型的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-14 19:58:43

就目前而言,似乎有几种选择,所有这些选择都有一些缺点

鉴别器

代码语言:javascript
复制
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;        
}

  • 用户定义类型保护docs stackblitz,但您将需要if语句而不是switch

代码语言:javascript
复制
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 
}

所需的类型

代码语言:javascript
复制
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;
  }
票数 29
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50774790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档