首页
学习
活动
专区
工具
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,其功能是恢复给定键Q在B树中的状态,用于迭代器中断时的恢复。

17810
  • Java集合类型详解

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

    76420

    Java集合总览

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

    1.1K70

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

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

    24010

    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.9K30

    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

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

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

    2.9K41

    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值等于min或max)的成员。

    59110

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

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

    36941

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

    ,该如何淘汰掉已有的键 Redis进程在内存中存储数据,如果Redis进程崩溃了,进程中的数据会丢失,那么Redis如何利用持久化来保证数据的安全性 Redis的python程序实例及一些常用的高效使用手段...主要支持的操作如下表 命令 含义 SET 设置键值 GET 获得给定键的值 DEL 删除给定的键 List List即为列表,List在Redis底层采用的是双向链表实现的,所以我们会发现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

    Redis常用命令详解

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

    72933

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

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

    20910

    代码面试

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

    1.8K31

    数据结构

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

    84410

    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
    领券