我在自己的方法中包装了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>;
有什么可以用来引用该类型的东西吗?
答案 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 :)
更多说明:Parameters<T>
是函数T
的元组参数类型。 typeof post
获取函数的类型,然后我们想要第三个参数,它是索引2
中元组的类型。