分享
三行代码  ›  专栏  ›  技术社区  ›  Sadie Dotzler

不使用“get”创建相互引用常量`

  •  0
  • Sadie Dotzler  · 技术社区  · 1 周前

    我正在尝试实现这样的功能:

    export const foo: Bla {
      prop: [bar, baz]
    }
    
    export const bar: Bla {
      prop: [foo, bar]
    }
    
    export const baz: Bla {
      prop: [bar, baz]
    }

    但是很明显,酒吧还没有被定义为foo的定义,所以这是行不通的。我还想为道具数组编辑的代码以后,所以使用 get prop() {...}

    2 回复  |  直到 1 周前
        1
  •  0
  •   FZs    1 周前

    不,没有 好的/优雅的方式


    在你的例子中,虽然 变量 是康坦茨 物体

    通过滥用这个事实,你可以做到:

    export const foo: Bla {}
    export const bar: Bla {}
    export const baz: Bla {}
    
    foo.prop = [bar, baz]
    bar.prop = [foo, bar]
    baz.prop = [bar, baz]
    

    prop 属于 Bla 道具 在字面和 .push 值;这样就不必更改类型)。


    然而,这是一个相当黑客。正确的方法是使用getter(或lazy getter)和setter。

        2
  •  0
  •   Lodewijk Bogaards    1 周前

    type Bla = { prop: [Bla, Bla] };
    
    const emptyBla = undefined as any as Bla;
    export const foo: Bla = { prop: [emptyBla, emptyBla] }
    export const bar: Bla = { prop: [emptyBla, emptyBla] }
    export const baz: Bla = { prop: [emptyBla, emptyBla] }
    
    foo.prop = [bar, baz];
    bar.prop = [foo, bar];
    baz.prop = [bar, baz];
    
    

    通常你会通过一层间接的方法来打破这种循环。例如,不是存储对对象的引用,而是存储对象的标识符,然后将对象分别存储在某个中心位置。

    我不喜欢getter和setter,因为它会误导类的用户。