打字稿递归更改属性类型

And*_*kac 0 typescript

如何递归地更改属性类型,我只能在单维中做到这一点,从实用程序类型来看似乎可以实现这一点,我已经尝试了很多次,但无法做到正确

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',
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

jca*_*alz 5

我很确定你想要一个递归条件类型,你只递归到本身就是对象的属性:

type Convert<V, O extends object> = {
    [K in keyof O]: O[K] extends object ? Convert<V, O[K]> : V
}
Run Code Online (Sandbox Code Playgroud)

这将导致您的示例代码成功,但可能存在围绕您不想递归到的非原始属性的边缘情况(例如,数组?),因此您应该对其进行彻底测试。

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

Playground 链接到代码