返回值的类型以函数参数的类型为条件



我正在尝试编写一个类型安全的JSON:API规范解析器:API响应可以包含单个对象或对象数组(https://jsonapi.org/format/#document-structure)。

。: GET /article

{ 
  data: {
    type: 'article',
    id: article_id_1,
    attributes: { 
      name: article_1,
      price: price_1
    }
  }
}

GET /articles

{ 
  data: [{
    type: 'article',
    id: article_id_1,
    attributes: { 
      name: article_1,
      price: price_1
    },
  }, {
    type: 'article',
    id: article_id_2,
    attributes: { 
      name: article_2,
      price: price_2
    },
  }]
}

我希望我的函数的结果是类型安全的,所以我想创建一个泛型函数parseData<T>,其中T描述预期数据的类型。在本例中:

interface TArticle {
   id: string,
   type: string,
   name: string,
   price: number,
}

我已经试过了:

function parseData<T>(data: Data<T>): T | T[]

除了返回类型仍然可以是T或T[]之外,这工作得很好。当调用函数时:

const result = parseData<TArticle>(articleData);

我(和TypeScript)不知道result是article还是article[]。

我知道我可以根据我对API的了解和我期望的结果来转换结果,但我真的更喜欢一个合适的TS解决方案。

不需要返回T | T[]。当您执行以下操作时,您可以控制要返回的内容(返回的类型,而不是在运行时):

function parseData<T>(data: Data<T>): T {

如果你想要一个单独的TArticle,你只需使用

const result = parseData<TArticle>(articleData);
//    ^? TArticle

,如果你想要一个数组,使用

const result = parseData<TArticle[]>(articleData);
//    ^? TArticle[]

最新更新