ts:如何给对象的键限制类型

文章讨论了一个在TypeScript(TS)环境下遇到的问题,即如何在后端返回的枚举值数组中安全地绑定样式。文章提出了两种解决方案:1)定义接口,将枚举的每个值硬编码为接口的键;2)使用类型计算,创建一个基于枚举类型的映射。然而,即使使用这些方法,在访问styleObj[Status[0]]时仍可能出现类型错误。解决方案是通过类型断言确保安全性。
摘要由CSDN通过智能技术生成

一.场景

先来看一个业务场景
后端返回一个数组,数组里面描述了对象的状态,我们需要根据的状态去绑定样式或者class类

// 状态的枚举值
 enum Status{
  BEGIN, //开始
  RUNNING, // 运行
  ERROR//错误
 }
 const styleObj={
  BEGIN: {
    backgroundColor: '#fff'
  },
  RUNNING: {
    backgroundColor: '#ccc',
    opacity: 1
  },
  ERROR: {
    backgroundColor: '#007bedff',
    opacity: 0.5,
    color: '#fff'
  }
}

在template模板中需要这样操作

<template>
	<div v-for='item in list' :key='item.id' :style="styleObj[Status[0]]"><>
</template>

问题

以上写法,如果是js的化,没有任何问题,但是我们用的是ts,ts会显示item.status 是anyl类型,不能作为styleObj 的键

二.思路及实现

我们首先考虑到的是限制styleObj的键,如何限制呢?

  1. 第一种方式:写死
 interface IObj{
"BEGIN":unknown
"RUNNING":unknown
"ERROR":unknown

 }
const styleObj:IObj={
  BEGIN: {
    backgroundColor: '#fff'
  },
  RUNNING: {
    backgroundColor: '#ccc',
    opacity: 1
  },
  ERROR: {
    backgroundColor: '#007bedff',
    opacity: 0.5,
    color: '#fff'
  }
}
  1. 第二种方式,使用类型计算

type map=  typeof Status
type Tobj<T>={
  [Prop in keyof T] :unknown
 }
 const obj:Tobj<map>={
  BEGIN:{
    color:'red'
  },
  RUNNING:{
    color:"#00ff00"
  },
  END:{
    color:"#ff0000"
  }
 }

但是当我们访问 styleObj[Status[0]] 仍然显示类型错误,ts并不知道,Status[0] 是什么,我们可以在这里做一次断言,styleObj[Status[0]] as keyof typeof Status
通过打印typeof Status就可以得出“object”,枚举的本质是一个对象 ,keyof 则是遍历对象的键,并进行联合。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值