Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 从兄弟姐妹推断类型_Typescript - Fatal编程技术网

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
);