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

无法为具有相同联合类型的对象指定等效属性

  •  0
  • sam256  · 技术社区  · 5 年前

    我构造一个并集是为了允许一个类型具有两个属性中的一个或另一个,但不能同时具有这两个属性。以下是我正在使用的:

    type ObjBase = {
        foo: string
    }
    
    type ObjBaseWithBoo = ObjBase & {
        boo: string
        goo?: never
    }
    
     type ObjBaseWithGoo = ObjBase & {
            goo: string
            boo?: never
    }
    
    type ObjType = ObjBaseWithBoo | ObjBaseWithGoo
    

    我的问题是,如果我有两个这样的对象,我不能直接将一个对象的属性赋值给另一个对象的属性。所以如果我有 obj objTwo ,两种类型 ObjType ,此任务失败:

      let objTwo: ObjType = {
      foo: obj.foo,
      boo: obj.boo,
      goo: obj.goo
      }
    

    Typescript抱怨说:

    Type '{ foo: string; boo: string | undefined; goo: string | undefined; }' is not assignable to type 'ObjType'.
      Type '{ foo: string; boo: string | undefined; goo: string | undefined; }' is not assignable to type 'ObjBaseWithGoo'.
        Type '{ foo: string; boo: string | undefined; goo: string | undefined; }' is not assignable to type '{ goo: string; boo?: undefined; }'.
          Types of property 'goo' are incompatible.
            Type 'string | undefined' is not assignable to type 'string'.
              Type 'undefined' is not assignable to type 'string'.(2322)
    

    但我认为这是不对的。给定定义类型的方式,如果 obj.boo 可转让给 objTwo.boo 然后 obj.goo objTwo.goo . 这只是TS分析的局限性,还是我遗漏了更基本的东西?

    这是我的建议 playground

    (FWIW:除了提高我对TS的理解外,这一点很重要的原因是,这种“一个或另一个”结构对于在React中使用其他道具很有用,但如果你不能将这些道具传给孩子们,那么使用起来会很痛苦。)

    0 回复  |  直到 5 年前
    推荐文章