是否可以设置函数的泛型类型而不在Typescript中调用它?

是否可以设置函数的泛型类型而不在Typescript中调用它?,typescript,typescript-generics,Typescript,Typescript Generics,问题在标题中。下面是我试图实现的一个示例: const apiResponse = Promise.resolve({data: 1} as {data: any}); // Assume I don't know the type of data const mapData = <T>(res: {data: T}): T => res.data; const x = apiResponse.then(mapData<number>); // This one

问题在标题中。下面是我试图实现的一个示例:

const apiResponse = Promise.resolve({data: 1} as {data: any}); // Assume I don't know the type of data
const mapData = <T>(res: {data: T}): T => res.data;

const x = apiResponse.then(mapData<number>); // This one fails to compile
const y = apiResponse.then(mapData); // Succeeded but y is of type any
const z = apiResponse.then(_ => mapData<number>(_)); // Succeeded but verbose !
const apiResponse=Promise.resolve({data:1})为{data:any});//假设我不知道数据的类型
常量mapData=(res:{data:T}):T=>res.data;
const x=apiResponse.then(mapData);//这个不能编译
const y=apiResponse.then(mapData);//成功,但y属于任何类型
const z=apiResponse.then(=>mapData());//成功但冗长!
const-apiResponse=Promise.resolve({data:1,asType:(数据为任意)。{u-proto}as{data:any,asType:any});
const mapData=(res:{data:any,asType:{new(…args):T}}):T=>{
如果(资源数据){
res.data.\uuuu proto\uuuuu=res.asType;
返回res.data;
}
返回未定义;
}
const y=apiResponse.then(mapData);

这就是你想要的吗?

就我个人而言,我认为你的“冗长”电话没有任何问题

请注意,
GenFunc
不是泛型类型别名;它是指泛型函数类型的特定类型别名。您可以将类型参数
T
视为“属于”调用签名,而不是函数的名称或函数的任何类型别名的名称。由于它不属于函数名,您无法单独编写
mapData
,并且它不属于
GenFunc
类型名,因此您也无法编写
GenFunc


将其与引用一系列特定函数类型的不同但相关的泛型类型别名进行比较:

type GenAlias<T> = (res: {data: T; }) => T
因此,如果有必要,您可以在不进行额外函数调用的情况下编译以下内容:

const w = apiResponse.then(mapDataNumber); // Promise<number>
const w=apiResponse.then(mapDataNumber);//允诺
此外,如果您不想在变量赋值上浪费一行代码,您可以使用一个类型安全性稍低但绝对没有运行时影响的:

const v = apiResponse.then(mapData as GenAlias<number>); // Promise<number>
const v=apiResponse.then(将数据映射为GenAlias);//允诺
其中任何一个都应该适合你


好的,希望能有帮助。祝你好运


调用泛型函数类型时,只能指定其类型参数
\u=>f()
可能是您在这里可以合理期望的最佳答案。感谢您的高质量回复。这是你第二次帮我保存这最后两天的论文;-)。我不这么认为。我完全不明白你想做什么:D.如果在响应中传递值和实际类型,那么你可以通过将types原型对象分配给value对象来推断响应中的类型
type GenAlias<T> = (res: {data: T; }) => T
const mapDataNumber: GenAlias<number> = mapData; // okay
const w = apiResponse.then(mapDataNumber); // Promise<number>
const v = apiResponse.then(mapData as GenAlias<number>); // Promise<number>