我正在尝试编写一个类型安全的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[]