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

使用泛型类型接受两种不同类型的项作为参数

  •  1
  • theJuls  · 技术社区  · 2 年前

    这应该是一个简单的用例,但我似乎无法给出一个涵盖它的示例。

    基本上,我有一个函数,应该允许取两个非常相似的不同对象。所以,我想使用泛型类型。函数如下所示:

    const myFunction = <MyGenericType>(arrayOfObjects: MyGenericType[]) => {
      return arrayOfObjects.map((obj: MyGenericType) => ({
        id: obj.id,
        name: obj.name,
        someProperty: obj.someProperty || obj.someOtherProperty,
      }))
    }
    

    type PotentialType1 = {
      id: string
      name: string
      someProperty: string
    }
    
    
    type PotentialType2 = {
      id: string
      name: string
      someOtherProperty: string
    }
    

    myFunction 获取以下错误:

    它似乎可以完美地处理基本类型(如字符串、数字等),但如何处理更复杂的类型呢?

    1 回复  |  直到 2 年前
        1
  •  1
  •   Mark Hanna    2 年前

    问题是你的函数对 MyGenericType . 要让它知道此类型始终具有某些属性,需要添加约束。在这种情况下,看起来需要泛型类型是两个特定类型之一,因此可以告诉泛型函数: MyGenericType

    type PotentialType1 = {
      id: string
      name: string
      someProperty: string
    }
    
    
    type PotentialType2 = {
      id: string
      name: string
      someOtherProperty: string
    }
    
    const myFunction = <MyGenericType extends PotentialType1 | PotentialType2>(arrayOfObjects: MyGenericType[]) => {
      return arrayOfObjects.map((obj: MyGenericType) => ({
        id: obj.id,
        name: obj.name,
        someProperty: 'someProperty' in obj ? obj.someProperty : obj.someOtherProperty,
      }))
    }
    

    TypeScript Playground

    someProperty obj 而不是抱怨这些属性在类型为的对象上不存在 PotentialType1 | PotentialType2