打字稿array.map无法正确分配相交类型

休斯

我有一个类型数组,object[] & Tree[]arr.map(child => ...)推断了孩子的类型object而不是object & Tree

有没有其他方法可以避免这种情况?

值得注意的是Tree扩展,object但是打字稿似乎没有意识到这一点,并且将交叉点类型的两个部分合并了。

编辑-最小的可复制示例:

这是人为的,但是基于我最近的另一个问题:将打字稿对象类型转换为引用自身的映射类型

interface BasicInterface {
    name: string;
    children: object[];
}

function getBasic<T extends object>(input: T): BasicInterface {
    return input as BasicInterface;
}

export const basicTree = getBasic({
    name: 'parent',
    children: [{
        name: 'child',
        children: []
    }]
});

关键是下面的代码可以访问“ basicTree”及其推断的类型。对于此示例,我已经定义了BasicInterface,但实际上它是自动生成的,并且我还没有找到以编程方式生成递归接口的方法。

我想在原始接口定义的基础上添加子代的递归类型。

我试图用正确的递归定义来“增强” basicTree类型的定义,而不是完全在代码中重新定义BasicInterface,因为这可能是很多样板。

但这在获得儿童类型时会下降。也许有一个更简单的解决方案?

type RestoredInterface = typeof basicTree & {
    children: RestoredInterface[]
};

function getTree(basic: BasicInterface): RestoredInterface {
    return basic as RestoredInterface;
}

const restoredTree = getTree(basicTree);

const names = restoredTree.children.map(child => child.name);
沙洛姆皮肤

我找到了一个奇怪的解决方案。只需更改声明中的顺序即可。太奇怪了,但是有效:

type RestoredInterface = {
    children: RestoredInterface[]
} & typeof basicTree;

编辑:这是一个解释

更好的解决方案可以是这样的:

type RestoredInterface = Omit<typeof basicTree, 'children'> & {
    children: RestoredInterface[]
};

游乐场

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章