打字稿递归更改属性类型

时间:2020-02-17 02:02:02

标签: typescript

如何递归地更改属性类型,我只能在单一维度上进行操作,从utility-types来看,似乎有可能实现这一点,我已经尝试了很多次,但无法正确完成

type Convert<V, O extends object> = {
    [Key in keyof O] : V
}

// single
{
    let original = {
        data1 : 1,
        data2 : 1,

    };

    let converted : Convert<string, typeof original> = {
        data1: 'a',
        data2: 'a',
    };
}

// recursive
{
    let original = {
        data1 : 1,
        data2 : 1,
        data3 : {
            data1 : 1,
            data2 : 1,
        }
    };

    let converted : Convert<string, typeof original> = {
        data1: 'a',
        data2: 'a',
        data3 : {
            data1 : 'a',
            data2 : 'a',
        }
    };
}

1 个答案:

答案 0 :(得分:4)

我很确定您要使用递归conditional类型,只递归到本身就是对象的属性中:

type Convert<V, O extends object> = {
    [K in keyof O]: O[K] extends object ? Convert<V, O[K]> : V
}

这将使您的示例代码成功,但是在某些情况下,您不希望递归到非原始属性(例如,数组?)周围,因此您应该对其进行彻底的测试。

希望有所帮助;祝你好运!

Playground link to code