当前位置: 首页 > 知识库问答 >
问题:

在字符串联合中彻底迭代所有值?

钱欣悦
2023-03-14

我有一个像这样的字符串联合:

导出类型间隔='总计'|'每周'|'双周'|'每月'|'每年';

我希望通过循环工会值数组向用户显示这些值:

const intervals = ['total', 'weekly', 'biweekly', 'monthly', 'annually'];
intervals.forEach(...);

如何键入间隔数组,以保证它具有间隔联合的所有值?

共有3个答案

顾鸣
2023-03-14

如何键入间隔数组,以保证它具有间隔联合的所有值

不容易。您可以将其声明为元组的联合。假设你只有'总计'|'每周',你可以这样做:

const intervals: 
| ['total', 'weekly']
| ['weekly', 'total']

这里有一个排列nPn

公羊学义
2023-03-14

从数组派生类型,而不是从类型派生数组。

export const INTERVALS = ['total', 'weekly', 'biweekly', 'monthly', 'annually'] as const;

const temp = [...INTERVALS];
export type Interval = typeof temp[0];
章锦
2023-03-14

很容易确保间隔必须可分配给Array

const intervalsMisspelled: Array<Intervals> = 
  ['weekly', 'biweekly', 'annually', 'monthly', 'totul']; // error, "totul"

但这并不能阻止你忽略一些事情:

const intervalsMissing: Array<Intervals> = 
  ['weekly', 'biweekly', 'annually', 'monthly']; // oops, no error but missing "total"

为了解决这个问题,您可以创建一个名为ensureArray()的帮助函数,它接受一个类型参数T(对您来说是interval),然后返回一个新函数,该函数接受T类型的参数列表,并为该列表推断一个数组类型a。如果A数组(A[number])的元素类型比T的元素类型窄,则您必须漏掉某些内容,并且应该会出现错误。下面是一种方法:

const ensureArray = <T>() => <A extends T[]>(
  ...a: A & ([T] extends [A[number]] ? A : never)
): A => a;

const ensureIntervalsArray = ensureArray<Intervals>();

const intervals = ensureIntervalsArray(
  'annually', 'biweekly', 'monthly', 'total', 'weekly'); // okay

const intervalsMisspelled = ensureIntervalsArray(
  'annually', 'biweekly', 'monthly', 'totul', 'weekly'); // error, "totul"

const intervalsMissing = ensureIntervalsArray(
  'annually', 'biweekly', 'monthly', 'weekly'); // error,
// [string, string, string, string] is not assignable to never

这是可行的,尽管您在intervalsMissing上得到的错误相当隐晦,即某些东西不可分配给never,而不告诉您真正的问题是什么。由于TypeScript目前不允许我们产生自定义类型错误,我们只能尝试解决这个问题。

下面给出了一个更奇怪的错误消息,但它给了开发人员一个提示:

const ensureArray = <T>() => <A extends T[]>(
  ...a: A & ([T] extends [A[number]] ? A :
    { errorMessage: [Error, "You are missing", Exclude<T, A[number]>] })
): A => a;

const ensureIntervalsArray = ensureArray<Intervals>();

const intervalsMissing = ensureIntervalsArray(
  'annually', 'biweekly', 'monthly', 'weekly'); // error,
// Property 'errorMessage' is missing in type 
// '["annually", "biweekly", "monthly", "weekly"]' 
// but required in type '{ errorMessage: [Error, "You are missing", "total"]; }'

希望其中一个足以满足你的需求。祝你好运!

 类似资料:
  • 本文向大家介绍彻底搞懂Python字符编码,包括了彻底搞懂Python字符编码的使用技巧和注意事项,需要的朋友参考一下 不论你是有着多年经验的 Python 老司机还是刚入门 Python 不久,你一定遇到过UnicodeEncodeError、UnicodeDecodeError 错误,每当遇到错误我们就拿着 encode、decode 函数翻来覆去的转换,有时试着试着问题就解决了,有时候怎么试

  • 问题内容: 如何使用索引逐个字符地迭代UTF-8字符串? 使用方括号运算符访问UTF-8字符串时,utf编码的字符包含2个或更多元素。 例如: 但我想拥有: 有可能,但是这非常慢,即。 是否有另一种无需使用字符就可以逐字符插入字符串的方法? 问题答案: 使用preg_split。使用“ u”修饰符, 它支持UTF-8 Unicode。

  • 我正在创建一个纸牌游戏,并希望迭代所有可能的纸牌组合。 例如(红心A,红心2),(红心A,黑桃2),(红心A,梅花2)等 我在用Java做这个 目前我有这个: 首先,我有 这是一副包含所有卡片的牌。然后我创建一个 现在我想遍历所有没有重复的卡片。 然而,我得到了一个。有人能给我一些关于如何做得更好的提示吗?

  • 如何在typescript中迭代字符串文字类型? 例如我定义这种类型 我想这样迭代 或者这在打字稿中根本不可能?

  • 问题内容: 我已经看到了关于获取所有可能的子字符串(即相邻字符集)的许多问题,但是对于生成所有可能的字符串(包括其子字符串的组合)都没有疑问。 例如,让: 我希望输出是这样的: 要点是,我们可以删除原始字符串中不相邻的多个字符(以及相邻的字符)。 到目前为止,这是我尝试过的: 但是,这只会从原始字符串中删除相邻字符串的集合,而不会返回上例中的元素。 另一个示例是,如果我们使用字符串,则输出列表应包

  • 问题内容: 为什么下面的工作?我希望会被抛出。 问题答案: 为什么必须起作用? 在JLS 5,第15.18.1.1节 JLS 8§15.18.1 “字符串连接运算符+” ,导致JLS 8,§5.1.11 “字符串转换”,要求该操作无故障成功: …现在只需要考虑参考值。如果引用为null,则将其转换为字符串“ null”(四个ASCII字符n,u,l,l)。否则,转换的执行就好像是通过调用不带参数的

  • 问题内容: 因此,有两种获取列表并将第二个列表的成员添加到第一个列表的方法。您可以使用列表串联,也可以对其进行迭代。您可以: 或者您可以: 要么 我的问题是:哪个更快,为什么?我使用两个极大的列表(最多10000个对象)进行了测试,似乎迭代方法比列表串联快得多(如l1 = l1 + l2)。为什么是这样?有人可以解释吗? 问题答案: 一次添加每个项目,这是导致它变慢的原因,以及对的重复调用。 但是

  • 问题内容: 我有一个字符串迭代器。 为了进行排序,我需要从中创建一个列表并使用对其进行排序。 有没有简单的方法可以对迭代器进行排序。 问题答案: 迭代器不是容器,它是遍历容器元素的实用程序。因此,如果您仅有权访问迭代器,则无法更改此迭代器的创建者定义的迭代顺序。 如果您不能更改原始容器,则必须将迭代器传递的元素收集到新的Collection中,并在其中进行排序。 (了解迭代器可能的一种好方法是查看