如何在打字稿中使用函数参数类型?

时间:2019-03-27 20:11:50

标签: angular typescript

我在自己的方法中包装了Angular的HttpClient服务,但仍希望用户能够传递options,但是我似乎找不到在我自己的方法参数定义中引用该类型的好方法

示例:

  constructor(private http: HttpClient) {}

  my_request<T = any>(endpoint: string, payload: T, options: WhatTypeHere = {}) {
    return this.http.post<MyHttpResponse>(this.build_url(endpoint), this.build_payload(payload), {
      ...options,
      withCredentials: true,
    });
  }

您会看到options的{​​{1}}参数,我不知道该放在哪里,以便在使用my_request时可以强制执行。

这里是my_request() fyi的定义

HttpClient.post()

我知道我可以将整个定义复制粘贴到我的方法中,但是如果有某种方式可以引用它,我希望简洁明了,并且将来定义会更改。

我尝试的不起作用的一件事是类似post(url: string, body: any | null, options?: { headers?: HttpHeaders | { [header: string]: string | string[]; }; observe?: 'body'; params?: HttpParams | { [param: string]: string | string[]; }; reportProgress?: boolean; responseType?: 'json'; withCredentials?: boolean; }): Observable<Object>;

有什么可以用来引用该类型的东西吗?

1 个答案:

答案 0 :(得分:1)

至少在打字稿3.3(撰写本文时在操场上的版本)中,您可以提取post的第3个参数的类型。请参见下面的精简示例:

interface A {
    eh: number
}
function post(url: string, body: any | null, options?: {a: A}): void {}

// Create an alias for convenience 
type PostOptions = Parameters<typeof post>[2];

let options: PostOptions;
options = {}; // Expected error: Property 'a' is missing in type '{}' but required in type '{ a: A; }'.
options = { a: {} }; // Expected error: Property 'eh' is missing in type '{}' but required in type 'A'.
options = {a: {eh: 10}} // Ahh... just right :)

Playground link

更多说明:Parameters<T>是函数T的元组参数类型。 typeof post获取函数的类型,然后我们想要第三个参数,它是索引2中元组的类型。