【发布时间】:2020-07-23 01:47:15
【问题描述】:
我有一个执行获取请求的奇特函数。第一个参数描述了请求。第二个参数是一个可选的转换函数:
let data = useData({ /* desc request */}, (res) => res.values)
转换函数在函数返回之前转换响应(即设置data)。
这些函数的签名是:
// Signature for the transform function
type TransformFn<Data, R> = (data: Data) => R;
// Signature for the fetcher
function useData<Data = any>(
firstArg: object,
): Data;
function useData<Data = any, R = any>(
firstArg: object,
fn?: TransformFn<Data, R>
): R;
如果我这样做,效果会很好:
type Response = { values: string[] }
let data = useData<Response, Response["values"]>({ /* desc request */ }, (res) => res.values);
但是如果我不必传入第二个类型参数 (TransformedData),那就太棒了。我希望能够键入转换函数的参数,然后让 TypeScript 的惊人推理从那里获取它,如下所示:
let data = useData<Response>({ /* desc request */ }, (res) => res.value);
就目前而言,data 只是回退到默认类型 arg,any。
有什么提示吗?谢谢。
【问题讨论】:
-
去掉
= any不就行了吗?您甚至不需要显式指定泛型类型参数。 typescriptlang.org/play/#code/… -
嘿@zerkms - 感谢您的回复。您给出的示例存在问题:提供给
useData的第一个参数是Data类型的not。useData在幕后使用该参数来发出获取请求。 那个获取请求返回一个响应(Data),可以选择通过转换函数传递
标签: typescript