首页 > 其他分享 >ts enum 使用示例

ts enum 使用示例

时间:2024-12-02 21:22:09浏览次数:7  
标签:const 示例 enum ts value UserStatus Theme return

enum既可以作为值使用,也可以作为类型使用。

枚举的打印结果是一个对象
image

<template>
  <div class='box'>
    <div class="enum-demo">
      <h3>用户状态: {{ userStatusText }}</h3>

      <button @click="toggleUserStatus">切换用户状态</button>

      <div class="permission-list">
        <h3>权限等级展示:</h3>
        <div v-for="level in permissionLevels" :key="level">
          {{ getPermissionText(level) }}
        </div>
      </div>

      <div class="direction-demo">
        <h3>当前方向: {{ currentDirection }}</h3>
        <button @click="changeDirection">改变方向</button>
      </div>

      <div class="type-demo">
        <h3>Enum作为类型使用示例:</h3>
        <div>当前季节: {{ currentSeason }}</div>
        <button @click="updateSeason">更换季节</button>

        <div>当前主题: {{ theme }}</div>
        <button @click="switchTheme">切换主题</button>
      </div>
    </div>
  </div>
</template>

<script lang='ts' setup>
import { ref, computed } from 'vue';

// 用户状态枚举
enum UserStatus {
  Active = 1,
  Inactive = 2,
  Blocked = 3
}

// 权限等级枚举
enum PermissionLevel {
  Guest = 'GUEST',
  User = 'USER',
  Admin = 'ADMIN',
  SuperAdmin = 'SUPER_ADMIN'
}

// 方向枚举(使用计算属性形式)
enum Direction {
  Up = '上',
  Down = '下',
  Left = '左',
  Right = '右'
}

// 新增枚举定义
enum Season {
  Spring = '春天',
  Summer = '夏天',
  Autumn = '秋天',
  Winter = '冬天'
}

enum Theme {
  Light = 'light',
  Dark = 'dark'
}

// 状态相关
const userStatus = ref<UserStatus>(UserStatus.Active);

const userStatusText = computed(() => {
  switch (userStatus.value) {
    case UserStatus.Active:
      return '活跃';
    case UserStatus.Inactive:
      return '未激活';
    case UserStatus.Blocked:
      return '已封禁';
    default:
      return '未知状态';
  }
});

const toggleUserStatus = () => {
  if (userStatus.value === UserStatus.Active) {
    userStatus.value = UserStatus.Inactive;
  } else if (userStatus.value === UserStatus.Inactive) {
    userStatus.value = UserStatus.Blocked;
  } else {
    userStatus.value = UserStatus.Active;
  }
};

// 权限相关
const permissionLevels = Object.values(PermissionLevel);

const getPermissionText = (level: PermissionLevel) => {
  const permissionMap = {
    [PermissionLevel.Guest]: '访客权限',
    [PermissionLevel.User]: '普通用户权限',
    [PermissionLevel.Admin]: '管理员权限',
    [PermissionLevel.SuperAdmin]: '超级管理员权限'
  };
  return `${level}: ${permissionMap[level]}`;
};

// 方向相关
const directions = Object.values(Direction);
const currentDirectionIndex = ref(0);

const currentDirection = computed(() => {
  return directions[currentDirectionIndex.value];
});

const changeDirection = () => {
  currentDirectionIndex.value = (currentDirectionIndex.value + 1) % directions.length;
};

// 1. enum 作为类型使用
let currentSeason: Season = Season.Spring;  // 这里 Season 作为类型使用
const updateSeason = () => {
  // 这里 Season 作为值使用
  const seasons = Object.values(Season);
  const currentIndex = seasons.indexOf(currentSeason);
  currentSeason = seasons[(currentIndex + 1) % seasons.length];
};

// 2. 函数参数中使用 enum 作为类型
function handleThemeChange(newTheme: Theme) {  // Theme 作为类型
  theme.value = newTheme;
}

// 3. 使用 enum 作为对象的属性类型
interface ThemeConfig {
  currentTheme: Theme;  // Theme 作为类型
  lastTheme?: Theme;    // Theme 作为可选类型
}

// 4. enum 作为值使用
const theme = ref<Theme>(Theme.Light);  // Theme.Light 作为值
const switchTheme = () => {
  // Theme 作为值来判断和赋值
  theme.value = theme.value === Theme.Light ? Theme.Dark : Theme.Light;
};

// 5. 类型断言中使用 enum
const validateTheme = (input: string): Theme => {
  if (Object.values(Theme).includes(input as Theme)) {
    return input as Theme;
  }
  return Theme.Light; // 默认值
};

// 6. 在泛型中使用 enum
function createEnumMap<T extends Theme>(theme: T): Record<string, boolean> {
  return {
    isLight: theme === Theme.Light,
    isDark: theme === Theme.Dark
  };
}
</script>

<style lang='scss' scoped>
.enum-demo {
  padding: 20px;

  button {
    margin: 10px 0;
    padding: 5px 10px;
  }

  .permission-list {
    margin: 20px 0;

    div {
      margin: 5px 0;
      padding: 5px;
      background-color: #f5f5f5;
    }
  }

  .direction-demo {
    margin-top: 20px;
  }
}

.type-demo {
  margin-top: 20px;
  padding: 10px;
  border-top: 1px solid #eee;

  button {
    margin: 5px 0;
  }
}
</style>

标签:const,示例,enum,ts,value,UserStatus,Theme,return
From: https://www.cnblogs.com/jocongmin/p/18582770

相关文章

  • Bootstrap-Flask的完整开发示例
    下面是一个完整的Bootstrap-Flask示例项目,展示如何结合Flask-WTF和Bootstrap-Flask构建一个带有表单的网页。项目功能1.提供一个简单的用户注册表单。2.使用Flask-WTF定义表单。3.使用Bootstrap-Flask自动为表单和字段应用Bootstrap样式。目录结构boots......
  • 为什么在Java中要及时关闭BufferedReader、FileReader、FileInputStream?
    为什么在Java中要及时关闭BufferedReader、FileReader、FileInputStream?在Java中,处理文件和输入输出流的类,如BufferedReader、FileReader和FileInputStream,通常都涉及到操作系统级的资源,比如文件句柄和内存缓冲区。这些资源是有限的,因此我们必须确保及时关闭它们,以避免......
  • 基于Bootstrap3的简单柱状图表插件
    jchart是一款简单小巧的基于Bootstrap3.x的jquery柱状图表插件。该柱状图片表插件通过简单的设置,就可以生成非常漂亮的水平柱状图,并带有水平和垂直标签以及图表的头部和尾部。 在线演示  下载使用方法该jQuery柱状图插件可以通过javascript来调用,也可以直接使用HTML标签......
  • 编译OpenCV——jetson嵌入式平台
    jetson嵌入式平台的系统为:ubuntu20.04aarch64不再研究Ubuntux64上交叉编译ubuntuaarch64的OpenCV库,因为无法识别到arm的GTK导致编译不进去,最终imshow时会报如下错误:modules/highgui/src/window.cpp:611:error:(-2)Thefunctionisnotimplemented.Rebuildthelibraryw......
  • ASP.NET Core 9.0 中新增的MapStaticAssets() 中间件
    前言在Core9.0版本中新增的内容不算多,除了内置OpenAPI外应该就属MapStaticAssets中间件最有价值了,最初MapStaticAssets主要是为了解决Blazor静态资源加载缓慢而生的,当然只要是wwwroot下的任何静态资产都是可以使用TA平替UseStaticFiles的,因此在了解了TA的优势后建议升级......
  • 【上週綜合國際資訊】—— LetsTG
    發現更多好玩有趣的頻道群組。——letstg.com​​​​​​​​​​​​​​1.商業快訊——Stellantis首席執行官唐唯實將卸任Stellantis在聲明中表示,公司董事會周日已接受唐唯實辭去首席執行官一職。這家汽車製造商先前曾表示,唐唯實將繼續留任至其合同到期,即2026年初。2.國......
  • WebRTC信令中的双占用分解应用(Jitsi)
    WebRTC中的信令是WebRTC通信中的一个关键组成部分,它负责在两端设备之间交换通信信息,包括会话的建立、媒体能力协商(SDP交换)、网络候选协商(ICE)等。在一些复杂的实时通信应用中,尤其是涉及多人通话或会议场景时,双占用是一个常见的挑战。双占用通常指的是在同一时间内两个用户尝试......
  • RTSP播放器EasyPlayer.js出现Failed to construct 'Worker': Script at 'https://a.co
    随着技术的发展,越来越多的H5流媒体播放器开始支持H.265编码格式。例如,EasyPlayer.js播放器能够支持H.264、H.265等多种音视频编码格式,这使得播放器能够适应不同的视频内容和网络环境。那么播放器为什么会显示Failedtoconstruct’Worker’:Scriptat’https://a.com’cannotbeacce......
  • (系列十三)Vue3+Echarts搭建超好看的系统面板
    说明  该文章是属于OverallAuth2.0系列文章,每周更新一篇该系列文章(从0到1完成系统开发)。   该系统文章,我会尽量说的非常详细,做到不管新手、老手都能看懂。   说明:OverallAuth2.0是一个简单、易懂、功能强大的权限+可视化流程管理系统。友情提醒:本篇文章是属于系......
  • 【HarmonyOS开发】华为商城应用页面实验示例解析(ArkTS实战解析)
    一.实验背景本次项目为华为云鸿蒙应用入门级开发者认证的实验项目,借此来巩固对ArkTS的学习。实验源地址开发者云实验_云实验KooLabs_在线实验_上云实践_云计算实验_AI实验_华为云官方实验平台-华为云 实验目标本实验一共需要完成以下三个部分的任务:本实验将模拟制作......