首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

给定一个已有的键,如何在有序的typescript字符串枚举中获得下一个或上一个键?

在TypeScript中,如果你有一个有序的字符串枚举,并且想要根据给定的键获取下一个或上一个键,你可以使用映射类型和条件类型来实现这一功能。以下是一个示例,展示了如何定义这样的类型以及如何使用它们。

定义有序字符串枚举

首先,定义一个有序的字符串枚举:

代码语言:txt
复制
enum OrderedStringEnum {
    A = 'A',
    B = 'B',
    C = 'C',
    D = 'D',
}

创建映射类型

接下来,创建两个映射类型,一个用于获取下一个键,另一个用于获取上一个键:

代码语言:txt
复制
type NextKey<K extends keyof typeof OrderedStringEnum> = 
    K extends typeof OrderedStringEnum.A ? typeof OrderedStringEnum.B : 
    K extends typeof OrderedStringEnum.D ? never : 
    keyof typeof OrderedStringEnum extends infer T ? T extends K ? never : T[number] : never;

type PrevKey<K extends keyof typeof OrderedStringEnum> = 
    K extends typeof OrderedStringEnum.D ? typeof OrderedStringEnum.C : 
    K extends typeof OrderedStringEnum.A ? never : 
    keyof typeof OrderedStringEnum extends infer T ? T extends K ? never : T[number] : never;

使用映射类型

现在,你可以使用这些类型来获取给定键的下一个或上一个键:

代码语言:txt
复制
const nextKey = <K extends keyof typeof OrderedStringEnum>(key: K): NextKey<K> => {
    const keys = Object.keys(OrderedStringEnum) as (keyof typeof OrderedStringEnum)[];
    const index = keys.indexOf(key);
    return (index === -1 || index === keys.length - 1) ? null : (OrderedStringEnum as any)[keys[index + 1]];
};

const prevKey = <K extends keyof typeof OrderedStringEnum>(key: K): PrevKey<K> => {
    const keys = Object.keys(OrderedStringEnum) as (keyof typeof OrderedStringEnum)[];
    const index = keys.indexOf(key);
    return (index <= 0) ? null : (OrderedStringEnum as any)[keys[index - 1]];
};

示例

代码语言:txt
复制
console.log(nextKey(OrderedStringEnum.A)); // 输出: B
console.log(prevKey(OrderedStringEnum.C)); // 输出: B
console.log(nextKey(OrderedStringEnum.D)); // 输出: null
console.log(prevKey(OrderedStringEnum.A)); // 输出: null

解释

  1. 定义有序字符串枚举:我们定义了一个有序的字符串枚举OrderedStringEnum
  2. 创建映射类型:我们创建了两个映射类型NextKeyPrevKey,它们分别用于获取下一个键和上一个键。
  3. 使用映射类型:我们定义了两个函数nextKeyprevKey,它们使用映射类型来获取给定键的下一个或上一个键。

应用场景

这种类型和方法在需要处理有序枚举值的场景中非常有用,例如在状态机、导航菜单、时间线等应用中。

参考链接

通过这种方式,你可以方便地在有序的TypeScript字符串枚举中获取下一个或上一个键。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Redis常用数据类型、使用场景及操作命令

得到所有的给定值 SETBIT key offset value 设置清除该位在存储字符串值偏移 SETEX key seconds value...获得两个集合交集,并存储一个集合 SISMEMBER key member 确定一个给定值是一个集合成员 SMEMBERS...多重交叉排序集合,并存储生成一个有序集合 ZLEXCOUNT key min max 计算一个给定字典范围之间有序集合成员数量...从有序集合删除一个多个成员,不存在成员将被忽略 ZREMRANGEBYLEX key min max 删除所有成员在给定字典范围之间有序集合 ZREMRANGEBYRANK...确定一个有序集合成员索引,以分数排序,从高分到低分 ZSCORE key member 获取给定成员相关联分数一个有序集合

1.5K30

听GPT 讲Rust源代码--libraryalloc(2)

B树是一种自平衡搜索树数据结构,用于在有序数据集合中进行高效地查找、插入和删除操作。B树,每个节点可以存储多个,这些按照顺序排列,并且每个对应一个子节点。...OccupiedError是一个表示位置已被占用错误类型,当使用B树映射entry方法插入存在时,就会返回一个OccupiedError对象,其中包含了存在和值。...它用于表示迭代器的当前状态,其中包含一个读取元素,并记录每个迭代器迭代器状态。这些状态信息有助于合并迭代器进行下一个迭代时能够正确地更新各个迭代器位置。...PeekedNext是Peeked一个变体,它不仅包含读取元素,还包含下一个元素预览。...其中Recover是一个trait,其功能是恢复给定QB树状态,用于迭代器中断时恢复。

17010
  • Java集合类型详解

    可以作为其他集合类型构造器参数。 Arrays.binarySearch:一个排序或者其中一段快速查找。...枚举集合在Java 1.5重新发布,并且从这个版本之后所有的集合都支持泛型。PriorityQueue也Java 1.5加入。...由一个整形数字数组存储了集合大小(数组一个没有使用元素)。像所有的List集合一样,ArrayList可以必要时候扩展它大小。ArrayList访问元素时间开销固定。...LinkedList:Deque实现:每一个节点都保存着上一个节点和下一个节点指针。...这个类实现了一个NavigableMap接口:可以带有与数量不同入口,可以得到上一个或者下一个入口,可以得到另一Map某一范围(大致和SQLBETWEEN运算符相同),以及其他一些方法。

    75220

    Java集合总览

    可以作为其他集合类型构造器参数。 Arrays.binarySearch:一个排序或者其中一段快速查找。...枚举集合在Java 1.5重新发布,并且从这个版本之后所有的集合都支持泛型。PriorityQueue也Java 1.5加入。...由一个整形数字数组存储了集合大小(数组一个没有使用元素)。像所有的List集合一样,ArrayList可以必要时候扩展它大小。ArrayList访问元素时间开销固定。...LinkedList:Deque实现:每一个节点都保存着上一个节点和下一个节点指针。...这个类实现了一个NavigableMap接口:可以带有与数量不同入口,可以得到上一个或者下一个入口,可以得到另一Map某一范围(大致和SQLBETWEEN运算符相同),以及其他一些方法。

    1.1K70

    深入理解 TypeScript Keyof 运算符,让你代码更安全、更灵活!

    一、如何定义 KeyOf 运算符 TypeScript ,keyof 运算符用于获取用户定义值。它主要用于泛型,格式类似于联合运算符及其属性。keyof 运算符会检索用户指定索引。...使用 KeyOf 运算符创建联合类型 TypeScript ,当我们具有显式对象类型上使用 keyof 运算符时,它会创建一个联合类型。...通过使用 keyof stringMapDemo,我们确保传递 property 是一个字符串类型。 六、使用 KeyOf 条件映射类型 条件类型用于根据条件表达式两个声明类型之间进行选择。...这个模式实际开发中非常有用,特别是需要根据某些状态(如枚举)来确定显示样式标签时。...本文中,我们探讨了如何TypeScript 泛型、映射类型、显式、索引签名、条件映射类型和实用类型中使用 keyof 运算符。

    17110

    TypeScript 枚举类型

    使用枚举我们可以定义一些带名字常量。 使用枚举可以清晰地表达意图创建一组有区别的用例。 TypeScript支持数字和基于字符串枚举。...利用这个特性,确保不出现冲突提前下,我们还可以合并在不同文件定义相同名称枚举分开定义枚举。...当一个表达式满足下面条件之一时,它就是一个常量枚举表达式: 一个枚举表达式字面量(主要是字符串字面量数字字面量); 一个对之前定义常量枚举成员引用(可以是不同枚举类型定义); 带括号常量枚举表达式...版本,引入了一个众人期待特性 —— 字符串枚举。...字符串枚举概念很简单,一个字符串枚举里,每个成员都必须用字符串字面量,另外一个字符串枚举成员进行初始化。

    1.5K10

    【TS 演化史 -- 13】字符串枚举 和 弱类型(Weak Type)探测

    字符串枚举 TypeScript 2.4 实现了最受欢迎特性之一:字符串枚举,或者更精确地说,带有字符串值成员枚举。...字符串枚举成员没有反向映射 TypeScript 为每个构造映射对象枚举发出一些映射代码。...有时,可能有必要发出一个const枚举映射代码,例如,当某些 JS 代码需要访问它时,在这种情况下,可以tsconfig.json文件打开prepareConstEnums编译器选项: {...另一个好处是 TypeScript 语言可以给咱们自动完成建议,因为类型注释告诉它咱创建对象类型。 弱类型解决方法 如果出于某种原因,咱们就是不想从特定弱类型弱类型检测获得错误,该怎么办?...也许一个用例,这种方法是有意义,但是通常,咱们应该更喜欢其他解决方案之一。 弱类型检测限制 请注意,弱类型检测仅在属性完全没有重叠时才会产生类型错误。

    1.6K10

    TypeScript基础常用知识点总结

    lastIndexOf() 返回一个指定字符串值最后出现位置,一个字符串指定位置从后向前搜索。 map() 通过指定函数处理数组每个元素,并返回处理后数组。...TypeScript—Map对象 Map 对象保存键值对,并且能够记住原始插入顺序。任何值(对象或者原始值) 都可以作为一个一个值。...面向对象语言中,接口(Interfaces)是一个很重要概念,它是对行为抽象,而具体如何行动需要由类(classes)去实现(implement)。接口一般首字母大写。...(Days[0]); // Sun 我们也可以给枚举项手动赋值,未手动赋值枚举项会接着上一个枚举项递增: enum Days {Sun = 7, Mon = 1, Tue, Wed, Thu, Fri...TypeScript字符串字面量类型 字符串字面量类型用来约束取值只能是某几个字符串一个

    4.8K30

    JAVA常用API整理

    nextInt()double nextDouble() 读取并转换下一个表示整数浮点数字符序列 for each循环 for(variable : collection) statement...ArrayDeque 一种用循环数组实现双端队列 HashSet 一种没有重复元素无序集合 TreeSet 一种有序集 EnumSet 一种包含枚举类型值集合 LinkedHashSet 一种可以记住元素插入次序集...PriorityQueue 一种允许高效删除最小元素集合 HashMap 一种存储/值关联数据结构 TreeMap 一种键值有序排列映射表 EnumMap 一种键值属于枚举类型映射表 LinkedHashMap...) 设置给定位置元素并返回原来元素 int indexOf(Object element)int lastIndexOf(Object element) 返回与指定元素相等元素列表第一次出现位置返回与指定元素相等元素列表中最后一次出现位置...,但不能有重复,每个都对应一个值,真正存储图中是键值构成条目。

    2K41

    Redis常用命令详解

    复制链路和 AOF 文件处理过期方式 为了不牺牲一致性情况下获得正确行为,当key过期时,DEL 操作将同时 AOF 文件合成并获取所有附加从节点。...返回值 bulk-string-reply:该字段所关联值 当字段不存在或者 key 不存在时返回nil 4. hgetall key 返回 key 指定哈希集中所有的字段和值 返回值,每个字段名下一个是它值...若这个 key 是空,或者没有客户端等待这个 key, 那么将会去处理下一个从之前命令事务脚本获得新数据 key,如此等等。...点赞点踩,抽奖,读,共同好友 1. sadd key member [member …] **时间复杂度:**O(N) 添加一个多个指定member元素到集合 key.指定一个或者多个元素...返回有序集key,score值min和max之间(默认包括score值等于minmax)成员。

    58010

    学会这14种模式,你可以轻松回答任何编码面试问题

    数组元素集是一对,三元组甚至是子数组 以下是具有两个指针模式一些问题: 平方排序数组(简单) 总计为零三元组() 比较包含退格字符串) 3、快速指针慢速指针 快速和慢速指针方法,也称为...此模式一次反转一个节点,其中一个变量(当前)指向链接列表开头,而一个变量(上一个)将指向你处理上一个节点。 ...以锁定步骤方式,你可以通过将当前节点指向上一个节点来反转该节点,然后再移动到下一个节点。另外,你将更新变量" previous"以始终指向您处理上一个节点。...这是子集模式直观表示: 如何识别子集模式: 你需要查找给定集合组合排列问题 具有子集模式问题: 重复子集(简单) 更改大小写字符串排列() 11、修改后二进制搜索 每当给你排序数组,链接列表矩阵...只要获得" K"个排序数组,就可以使用堆来有效地对所有数组所有元素进行排序遍历。你可以将每个数组最小元素推入最小堆,以获取整体最小值。  获得总最小值后,将下一个元素从同一数组推到堆

    2.9K41

    图形编辑器开发:快捷管理

    快捷操作图形编辑器是很高频操作,能让用户快速高效地执行特定命令。 那么今天就来学习图形编辑器是如何做快捷管理。...也是可选。when 是一个方法,可以通过它拿到一些上下文参数,通过这些参数决定返回布尔值。如果为 true,表示匹配到了,并执行对应响应行为;如果为 false,没匹配到,继续找下一个。...: boolean; // 是否拖拽(比如移动工具移动图形) } 快捷注册 我们需要用有序表来根据注册顺序保存 keyBinding ,这里我选择用 Map 数据结构,它是一种有序数据结构。...如果你需要更细粒度,比如低优先级、优先级、高优先级,那你可以考虑传多一个优先级枚举一个数值,然后正确位置插入。感觉并没有太多需要用到这种粒度场景。...相关阅读, 事件订阅几种实现风格 用 TypeScript 实现类型安全 EventEmitter,这下不用怕写错事件名了 图形编辑器开发:模块间如何通信?

    36141

    Redis详解(1)——为什么我们一定要了解Redis

    ,该如何淘汰掉已有的 Redis进程在内存存储数据,如果Redis进程崩溃了,进程数据会丢失,那么Redis如何利用持久化来保证数据安全性 Redispython程序实例及一些常用高效使用手段...主要支持操作如下表 命令 含义 SET 设置键值 GET 获得给定值 DEL 删除给定 List List即为列表,ListRedis底层采用是双向链表实现,所以我们会发现Redis...判断是否集合 SMEMBERS 获取集合中所有的 SREM 删除集合给定 Sorted Set Sorted Set是有序集合,满足集合唯一性要求,同时也满足有序性质。...有序集合操作命令主要如下: ZADD 知乎热榜 2000 如何看待xxxxx 命令 含义 示例 ZADD 向有序集合添加元素 ZADD 知乎热榜 2000 如何看待xxxx ZREM 删除集合元素...ZREM 知乎热榜 如何看待xxxx ZRANGE 获取有序集合中排名处于[start, end]之间值 ZRANGE 知乎热榜 0 10 ZSCORE 获取集合给定score ZSCORE

    1.1K10

    Emacs 快捷

    C-f ,RightArrow forward-char 将插入点移动到下一个字符。 C-b ,LeftArrow back-char 将插入点移动到上一个字符。...M-f forward-word 将插入点移动到下一个单词。 M-b backward-word 将插入点移动到上一个单词。 C-v , PgDn scroll-up 将文本向上滚动一屏。...C-_ undo 撤消您上一次键入操作 C-q 字符 XXX quoted-insert 插入点插入按键本身代表字符 由八进制数字(XXX )表示字符。...C-s Enter C-w 单词或者短语 word-search-forward 整个缓冲区前向搜索给定单词或者短语(不管它们之间如何分隔)。...C-r Enter C-w 单词或者短语 word-search-backward 整个缓冲区后向搜索给定单词或者短语(不管它们之间如何分隔)。

    2K20

    5个非常有用TypeScript Typeof操作符技巧

    JavaScript,你可以通过 typeof 操作符获得变量类型,那么你知道TypeScript中使用 typeof 操作符是什么吗?...获取对象类型 man 对象是一个普通JavaScript对象,TypeScript你可以使用typeinterface来定义对象类型。...获取将所有枚举表示为字符串类型 TypeScript枚举类型是被编译成常规JavaScript对象特殊类型: 因此,也可以对枚举类型使用 typeof 操作符。...获得相应函数类型之后,你可以继续使用TypeScript内置ReturnType和Parameters实用工具类型来分别获得函数返回值类型和参数类型。 4....获得更精确类型 当使用 typeof 操作符时,如果你想获得更精确类型,那么你可以将它与TypeScript 3.4版引入const断言结合使用。它用法如下。

    16810

    Redis常用命令详解

    时间复杂度:O(N)与N是数据库数,假设数据库键名称和给定模式长度有限。 返回所有匹配模式。 虽然此操作时间复杂性为 O(N),但常量时间相当低。...hgetall key返回 key 指定哈希集中所有的字段和值 返回值,每个字段名下一个是它值,所以返回值长度是哈希集大小两倍返回值array-reply:哈希集中字段和值列表。...若这个 key 是空,或者没有客户端等待这个 key, 那么将会去处理下一个从之前命令事务脚本获得新数据 key,如此等等。...返回有序集key,score值min和max之间(默认包括score值等于minmax)成员。...如果key不存在,就创建一个只含有指定member成员有序集合。 当key不是有序集类型时,返回一个错误。 score值必须是字符串表示整数值双精度浮点数,并且能接受double精度浮点数。

    71033

    数据结构

    栈 栈(Stack) 是一种遵循 先进后出(LIFO) 原则有序集合。 新添加待删除元素都保存在站末尾,称为栈顶,另一端就叫栈底。 栈里,新元素都靠近栈顶,旧元素都接近栈底。...#链表 链表(LinkedList) 储存有序元素集合,每个元素都有一个储蓄元素本身节点和一个指向下一个元素引用(也称为指针或者链接)组成。 比如:寻宝游戏或者火车一系列车厢。 ?...next 指向 B 把 B next 指向 C #双向链表 链表是双向一个元素链向下一个元素同时也链向上一个元素。...#循环链表 每个元素不仅链向下一个元素和上一个元素,而且头部和尾部元素也相连,形成一个闭环。 head.prev = tail.next ? #集合 集合是由一组无序且唯一(即不能重复)项组成。... JavaScript 中就是对象,以为对象不能有两个相同。 EACAScript 6 Set 数据结构就是集合一种实现,它类似数组,但是成员都是唯一

    84010

    代码面试

    例如链表、数组字符串 要求找到最长/最短字符串,子数组所需值 题目练习 1. 大小为K最大总和子数组(简单) 2. 给定总和最小子数组(简单) 3....最长具有K个不同字符字符串) 模式二:双指针 “两个指针”是一种模式,其中两个指针串联遍历数据结构,直到一个两个指针都达到特定条件。...数组元素集是一对,三元组甚至是子数组 以下是具有两个指针模式一些问题: 平方排序数组(简单) 总计为零三元组() 比较包含退格字符串) 模式三:快慢指针 快速和慢速指针方法,也称为 Hare...此模式一次反转一个节点,其中一个变量(当前)指向链接列表开头,而一个变量(上一个)将指向您处理上一个节点。...以锁定步骤方式,您可以通过将当前节点指向上一个节点来反转该节点,然后再移动到下一个节点。另外,您将更新变量“ previous”以始终指向您处理上一个节点。

    1.8K31

    redis简单使用

    MGET命令就是一个版本GET命令,MGET接受一个多个字符串作为参数,并返回这些字符串值:MGET key [key ...]redis> MGET message number homepage1...相反,因为每个字符串只能存储一个键值对,所以如果用户要使用字符串去存储多个数据项,就只能在数据库创建多个字符串。...图片2.3.3、LPUSHX、RPUSHX:只对存在列表执行推入操作当用户调用LPUSH命令RPUSH命令尝试将元素推入列表时候,如果给定列表并不存在,那么命令将自动创建一个空列表,并将元素推入刚刚创建列表...带有NX选项ZADD命令只会向有序集合添加新成员,而不会对已有的成员进行任何更新。默认情况下,可以向有序集合添加新成员,也可以对有序集合存在成员分值进行更新。...流是一个包含零个任意多个流元素有序队列,队列每个元素都包含一个ID和任意多个键值对,这些元素会根据ID大小流中有序地进行排列。

    1.9K20
    领券