Typescript 从兄弟姐妹推断类型
我正在用以下接口编写一些中间件Typescript 从兄弟姐妹推断类型,typescript,Typescript,我正在用以下接口编写一些中间件 interface Config { callApi<P> (api: ApiClient): Promise<P>, transformResponse?(payload: P): any } 示例用法 const callCreateComment: Config = { callApi (api) => api.createComment(), transformResponse(payload) =&
interface Config {
callApi<P> (api: ApiClient): Promise<P>,
transformResponse?(payload: P): any
}
示例用法
const callCreateComment: Config = {
callApi (api) => api.createComment(),
transformResponse(payload) => ({ ...payload // infer the return type of the `api.createComment()` call })
}
好的,我想我理解你想要的,那就是写出
callApi()
方法,然后让TypeScript使用该方法的返回类型来约束transformResponse()
方法的参数。我不知道如何让推理与对象文字一起工作。似乎没有及时解析泛型ApiResponse
参数,以便在上下文中将参数类型约束为transformResponse()
我可以让推理工作的方法是将对象文本分成两部分,让一个函数将这些部分作为参数,并将它们放在一起。这使我们能够利用for上下文类型的函数参数。仅仅向您展示以下内容可能更有意义:
我将为您假设以下定义,因为您没有指定它们:
interface Comment {
something: string; // who knows
}
interface ApiClient {
createComment(): Promise<Comment>;
}
最后,这里是您的配置
,它实际上与您的(编辑的)版本相同,使用R
而不是apisresponse
:
interface Config<R> {
callApi: CallApi<R>,
transformResponse?: TransformResponse<R>
}
您将注意到,在中键入时,payload
的上下文类型将被推断为注释
。而callCreateComment
被键入为Config
,而无需根据需要在该函数的任何位置指定Comment
希望有帮助。祝你好运 这感觉像是你要求的,但我不确定。你能说明你将如何使用它,以及你希望如何被阻止使用它吗?显然,您可以只返回一个
承诺
并使用有效负载:any
,但我想您正在尝试强制执行某些内容。你真的是说Config
的callApi()
函数允许调用者指定P
?或者是callApi()
将向调用者P
返回一些必须由同一对象上的transformResponse
接受的未知信息?我删除了结果类型以清理示例。主要的一点是,我希望能够在transformResponse
函数中推断/自动完成API调用的返回类型,而不必手动指定其返回类型。这绝对是美妙的,正是我想要的!非常感谢。唯一缺少的是,有效负载(正确地)被推断为承诺,我希望它只返回未包装的值,而不是承诺。这可能吗?嗯,有效载荷
被明确地推断为仅仅是R
。callApi()
的返回值是Promise
,但这是您指定的类型定义。如果您想让它只返回R
,您可以更改类型信号。如果你在问如何把一个承诺
变成R
,那么这个问题已经被问过很多次了,简短的回答是“你不能”。较长的答案是“您将需要使用异步技术来代替”。您是对的,我现在让它工作起来了。非常感谢你!
type CallApi<R> = (api: ApiClient) => Promise<R>;
type TransformResponse<R> = (payload: R) => any;
interface Config<R> {
callApi: CallApi<R>,
transformResponse?: TransformResponse<R>
}
const buildConfig = <R>(
callApi: CallApi<R>,
transformResponse?: TransformResponse<R>
): Config<R> => ({ callApi, transformResponse });
const callCreateComment = buildConfig(
(api) => api.createComment(), // R is inferred as Comment
(payload) => ({ ...payload }) // payload is now constrained
);