壹 ❀ 引

最近因为有一些闲散时间,所以一直在做将Class组件重构为typescript + hooks组件的工作,结果今天就遇到一个有趣的问题。我们知道react Class组件一般都会定义Component.propTypes属性,目的在于限制组件props类型以及某个属性是否必传等。结果在改写过程中,我发现有个属性它的定义是一个枚举:

// 枚举定义,这里借用了项目自己封装的枚举创建方法
const PaymentTypeEnum = createSimpleEnum({
SENIOR: {
value: 'pro',
type: 1,
},
TRIAL: {
value: 'trial',
type: 2
},
FREE: {
value: 'free',
type: 0,
},
PENDING: {
value: 'pending',
type: 3
}
}); // props大概的定义,type的结构可能是
Component.propTypes = {
type: PropTypes.oneOf(EnumHelper.enumValues(PaymentTypeEnum)
}

这里的type类型就表示属于PaymentTypeEnum其一,它可能是{value:'pro',type:1},也可能是{value:'free',type:0},而ts是自带枚举的,所以这里我需要将其修改为ts的枚举,让其类型推断上也能满足枚举其一。

贰 ❀ 解决Enum枚举值不能是对象

我们知道ts中的类型其实可以分为比较抽象的原始类型,以及较为具体的字面量类型,比如我希望变量a的值一定是个字符串,这里就能用抽象的string表示:

const a:string = '1';

此时a的值就必须是个字符串。而有时候我们希望某个变量的值,是按照我们预设好的值其一,这里就可以用联合类型结合字面量类型来达到效果,比如:

type NameType = 'echo' | '听风是风' | '时间跳跃';
const user: NameType = 'echo';

此时user就只能是echo这三个值其一,这在我们日常开发中,当为组件预设了部分固定配置时将十分有用。

所以回到开头的问题,我现在就是希望type的类型约束,是我定义的枚举定义四个对象中的某一个,但尴尬的是,ts枚举值定义并不支持对象,这会直接导致报错,这里我们可以借用接口与枚举达到这个效果:

// 定义枚举
enum PaymentTypeEnum {
SENIOR,
TRIAL,
FREE,
PENDING,
}; // 定义接口
interface PaymentType {
[PaymentTypeEnum.SENIOR]: {
value: 'pro';
type: 1;
};
[PaymentTypeEnum.TRIAL]: {
value: 'trial';
type: 2;
};
[PaymentTypeEnum.FREE]: {
value: 'free';
type: 0;
};
[PaymentTypeEnum.PENDING]: {
value: 'pending';
type: 3;
};
} // 组件props接口定义
interface ComponentPropsType {
type: PaymentType[PaymentTypeEnum]
}

我们来做个试验验证下,比如我现在要定义payment值为:

const payment: ComponentPropsType = {
type: {
value: 'pendings',// Type '"pendings"' is not assignable to type '"pro" | "trial" | "free" | "pending"'.
type: 4 // Type '4' is not assignable to type '0 | 1 | 2 | 3'.
}
}

可以看到,不管是value还是type,只要我们属性定义错误,或者额外多添加属性,都能正确达到错误提示。其实到这里我们就已经达到了枚举值是对象字面量类型的效果了。

typescript 实现enum枚举值定义为对象的更多相关文章

  1. Java进阶知识点1:白捡的扩展性 - 枚举值也是对象

    一.背景 枚举经常被大家用来储存一组有限个数的候选常量.比如下面定义了一组常见数据库类型: public enum DatabaseType { MYSQL, ORACLE, SQLSERVER } ...

  2. 获取Enum枚举值描述的几法方法

    原文:获取Enum枚举值描述的几法方法 1.定义枚举时直接用中文 由于VS对中文支持的很不错,所以很多程序员都采用了此方案. 缺点:1.不适合多语言 2.感觉不太完美,毕竟大部分程序员大部分代码都使用 ...

  3. MVC3不能正确识别JSON中的Enum枚举值

    一.背景 在MVC3项目里,如果Action的参数中有Enum枚举作为对象属性的话,使用POST方法提交过来的JSON数据中的枚举值却无法正确被识别对应的枚举值. 二.Demo演示 为了说明问题,我使 ...

  4. Enum 枚举值 (一) 获取描述信息

    封装了方法: public static class EnumOperate { public class BaseDescriptionAttribute : DescriptionAttribut ...

  5. java enum 枚举值

    public enum PieChartEnum { PIE00("pie00"), PIE10("pie10"), PIE11("pie11&quo ...

  6. Java进阶知识点: 枚举值

    Java进阶知识点1:白捡的扩展性 - 枚举值也是对象   一.背景 枚举经常被大家用来储存一组有限个数的候选常量.比如下面定义了一组常见数据库类型: public enum DatabaseType ...

  7. Java中的enum枚举类

    首先说说为什么要写这个enum枚举类吧,是群里有个新手问:怎样把enum类中的值遍历得到,其实自己用的也很少.自己也是确实不知道,于是我去网上搜了不少,总结了些,希望对大家有帮助:首先我说说怎样遍历枚 ...

  8. [数据库/MySQL]数据类型:enum 枚举类型

    1 需求描述 场景 性别(gender) :男 / 女 / 保密 2 基本语法 enum(枚举值 1,枚举值 2...); 枚举值列表在 255 个以内,使用 1 个字节来存储 枚举值列表超过 255 ...

  9. c# 枚举的定义,枚举的用法,获取枚举值

    1.定义枚举类型 public enum Test { 男 = , 女 = } 2.获取枚举值 public void EnumsAction() { var s = Test.男;//男 var a ...

  10. 利用DescriptionAttribute定义枚举值的描述信息 z

    System.ComponentModel命名空间下有个名为DescriptionAttribute的类用于指定属性或事件的说明,我所调用的枚举值描述信息就是DescriptionAttribute类 ...

随机推荐

  1. Deployment 和 StatefulSets 概述

    这篇概述是看文章提到的一段话 xxx is not targeted to be horizontally scalable 引发的,遂整理记录在这里. 起因是有两个应用,一个是无状态的,可以 hor ...

  2. C++编译器选择是否自动生成代码的背后逻辑

    C++编译器选择是否自动生成代码的背后逻辑 编译器会为class和struct(实际上两者在C++中是一回事)自动生成构造函数.赋值操作符函数和析构函数.如果不是这样,那么开发者就必须自己写一些枯燥冗 ...

  3. langchain中的Document类

      在Langchain-Chatchat的上传文档接口(upload_docs)中有个自定义的docs字段,用到了Document类.根据发现指的是from langchain.docstore.d ...

  4. Android之AMS原理分析

    在学习android框架原理过程中,ams的原理非常重要,无论是在面试中还是在自己开发类库过程中都会接触到. 1 简述 ActivityManagerService是Android最核心的服务,负责管 ...

  5. C++中不支持strdup(),使用_strdup()

    1.问题 C4996 'strdup': The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conf ...

  6. [转帖]记一次探索内存cache优化之旅

    https://developer.aliyun.com/article/972803 背景 项目上线以来,曾出现上传镜像.下发镜像时可用内存不足,性能发生抖动的情况.研究发现是容器的 page ca ...

  7. [转帖]K8S 挂载 minio csi 的方式.

    对象存储   前置条件 安装Minio(在102主机上操作) 安装csi-s3插件(在103主机上操作) 使用 参考 本文介绍kubernetes如何基于对象存储(minio)创建PV与PVC 前置条 ...

  8. [转帖]一本正经的八卦一下CPU的自主可控

    https://zhuanlan.zhihu.com/p/36391482 (2018年的4月16日,美国商务部发布对中兴通讯出口权限禁令,禁止美国企业向其出售零部件,史称"中兴禁运事件&q ...

  9. DPText-DETR: 基于动态点query的场景文本检测,更高更快更鲁棒 | 京东探索研究院

    针对场景文本检测任务,近期基于DEtection TRansformer (DETR) 框架预测控制点的研究工作较为活跃.在基于DETR的检测器中,query的构建方式至关重要,现有方法中较为粗糙的位 ...

  10. 解决刷新SwaggerUi控制台报错

    一.问题描述 在浏览器刷新SwaggerUI的页面,控制台就报错: java.lang.NumberFormatException: For input string: "" at ...