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

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

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

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

["list", "of", "Post"];
["list", "of", "list", "of", "Post"];
["list", "of", "list", "of", "list", "of", "Post"];
// ... could go on

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

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

预期行为:

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

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

实际行为:

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

nwo49xxi

nwo49xxi1#

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

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

uqdfh47h2#

@ahejlsberg 有任何建议吗?

lc8prwob

lc8prwob3#

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

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

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

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

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

相关问题