如何在TypeScript中使基本泛型类型知道子泛型?

4

有没有一种方法可以将两个泛型类型合并成一个基础类型,但同时使其中一个包含第二个作为泛型参数?

这是我的代码:

interface ITreeNode extends IBaseNode{
}

interface IBaseTree<T extends IBaseNode> {
    nodeType: T
}

interface IBaseForest <T extends IBaseTree<T2 extends IBaseNode>> {
    treeType: T
    nodeType: T2 
}

问题在于“T2扩展IBaseNode”,我不能真正设置另一个类型,在理论上,我不需要,因为基本树知道其节点的类型,我不能让森林了解这个节点是谁。

如果我表达不清楚,很抱歉,并感谢您的任何回复。

1个回答

2
我简化了一下。
  • 去掉了IBaseNode,因为它没有被声明且与我们的问题无关。将ITreeNode视为您的基本节点。
  • 使用通用占位符名称来匹配意图(例如字典中的K,V)。这里的意图是NodeNTreeT

所以以下是我认为你想要的:

interface ITreeNode{}

interface IBaseTree<N extends ITreeNode> {
    nodeType: N;
}

interface IBaseForest<N extends ITreeNode,T> {
    treeType: T;
    nodeType: N;
}

然而,如果你想基于N限制T,由于下面所示的限制,你无法实现:

enter image description here

这是根据规范来的。


1
你的答案是正确的,我猜我正在努力做一些我无法做到的事情。这个森林应该与树保持相同的节点类型,但我无法弄清楚如何正确声明它,因为在这种情况下节点类型可能在两个地方不同。此外,当我用基础类初始化扩展森林的接口时...它使得声明非常笨重。接口IAmazonForest扩展了IBaseForest<ITreeNode, IBaseTree<ITreeNode>>。 - Allen Bustenai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接