我有一个远程服务,它返回包含对象或对象数组的JSON.有时,当数组中有一个对象时,服务返回一个对象而不是包含一个对象的array.有一个函数实现了对服务的调用:
export async function ApiCall<T>(funcName : string, args? : ArgList) : Promise<T> {
var callPromise : Promise<T>;
//...implementation
return callPromise;
}
// usage:
ApiCall<MyType>("foo").then((myTypeObj) => {var x = myTypeObj.myField; /*...*/}); //1
ApiCall<MyType[]>("bar").then((array) => { for(var i = 0; i < array.length; ++i) /*...*/ }); //2
我想在这个函数中引入一个补丁,这样用法就保持不变--对"bar"的调用不必知道API调用的结果可能是一个MyType
对象.然而,我不知道如何获得在Case 1
和Case 2
中执行不同任务的编译代码.
我认为编写两个不同版本的ApiCall
并让编译器 Select 调用哪个版本是可行的,因为它在一个调用点具有所有相关信息,但似乎TypeScrip中的函数重载对此太有限了.
强制所有调用者传递一个额外的标志是可行的,但解决方案是丑陋的,如果需要更多的补丁,将变得更糟.
TypeScript中是否有类似于C++模板专门化的技巧和/或其他方法来解决所描述的问题?重申一下,我希望一个类似于函数的调用ApiCall
来执行如下操作:
return callPromise.then((result) => {return Array.isArray(result) ? result : [result];});
if and only ifT
是一个array.