代码之家  ›  专栏  ›  技术社区  ›  Automatico

更新部分对象的子属性

  •  1
  • Automatico  · 技术社区  · 4 年前

    我有一个部分对象,它有可能未定义的子属性,我想更新。

    interface Foo {
        data: string
        otherData: string
    }
    interface Bar {
        foo: Foo
    }
    interface Baz {
        bar: Bar
    }
    
    let a: Partial<Baz> = {}
    
    //... Desired action:
    a.bar.foo.data = 'newData'
    

    这是不允许的,因为属性可能未定义。解决这一问题的一个“办法”是以下畸形现象:;

    a = {
        ...a,
        bar: {
            ...a?.bar,
            foo: {
                ...a?.bar?.foo,
                data: 'newData'
            }
        }
    } as Partial<Baz>
    

    有没有更优雅的方法来实现这一点?

    ts playground example

    1 回复  |  直到 4 年前
        1
  •  2
  •   Aplet123    4 年前

    可以使用空的coaleCesing赋值运算符( ??= )为此:

    ((a.bar ??= {}).foo ??= {}).data = 'newData';