TypeScript 处理使用类型扩展的递归元组,

t98cgbkg  于 8个月前  发布在  TypeScript
关注(0)|答案(3)|浏览(86)

TypeScript版本: 4.0.2
搜索词: 递归元组类型的扩展元组
代码

我正在尝试创建一个类型,它可以评估以下任意一种情况:

  1. ["list", "of", "Post"];
  2. ["list", "of", "list", "of", "Post"];
  3. ["list", "of", "list", "of", "list", "of", "Post"];
  4. // ... could go on

以下方法会产生循环错误,尽管自3.7起元组类型就具有循环性,但仍然会出现错误:

  1. type Nested = ["list", "of", ...(["Post"] | Nested)];

预期行为:

能够对以下内容进行类型检查(例如):

  1. const nested: Nested = ["list", "of", "list", "of", "Post"];

实际行为:

循环错误。
如果有任何帮助,将不胜感激!谢谢!

nwo49xxi

nwo49xxi1#

另一个重要的能力是泛化"Nested"类型,使得以下内容也有效:

  1. type Nested<T extends string> = ["list", "of", ...([T] | Nested<T>)];
uqdfh47h

uqdfh47h2#

@ahejlsberg 有任何建议吗?

lc8prwob

lc8prwob3#

我遇到了这个问题,我有一个很好的最小示例,展示了一个看似容易思考的情况:

  1. type A = [A]; // OK
  2. type B = [...[B]]; // Type alias 'B' circularly references itself.

显然,这个示例不是在实际代码中编写合理的东西,但我认为它清楚地展示了扩展运算符导致类型检查器以某种方式“忘记”递归实际上是没问题的。
作为参考,我的实际用例类型看起来像这样:

  1. type ImapStruct = [ImapStructDetailsLeaf] | [ImapStructDetailsMultipart, ...Array<ImapStruct>];
  2. // Type alias 'ImapStruct' circularly references itself.

我试图输入从node-imap库中获取的内容;在库的类型存根中,它看起来就像它们只是拼写成 any[] 一样。

相关问题