Add a generic type argument to `fetch()` function and `Body` interface
See original GitHub issueThe generic type argument would add depth and consistency to the fetch types.
Expected behavior (example):
Generated definitions:
interface Body<T = any> {
readonly bodyUsed: boolean;
arrayBuffer(): Promise<ArrayBuffer>;
blob(): Promise<Blob>;
formData(): Promise<FormData>;
json(): Promise<T>;
text(): Promise<string>;
}
interface Request<T = any> extends Body<T> {...}
interface Response<T = any> extends Body<T> {...}
...
interface GlobalFetch {
fetch<T>(input?: Request | string, init?: RequestInit): Promise<Response<T>>;
}
Usage with type:
type MyFetchResponse = { a: string, b: number };
fetch<MyFetchResponse>('https://someserver.com/get?a=string&b=number').then(response => {
response.json().then(data => {
// data is MyFetchResponse
// Both of these are autocompleted at this point
data.a
data.b
data.c //Error: Property 'c' does not exist on type MyFetchResponse
})
})
Usage without types (same as current):
fetch('https://someserver.com/get?a=string&b=number').then(response => {
response.json().then(data => {
// data is any
data.a
data.b
data.c //No error here
})
})
Actual behavior:
fetch('https://someserver.com/get?a=string&b=number').then(response => {
response.json().then(data => {
// data is any
data.a
data.b
data.c //No error here
})
})
Motivation:
The proposed change would make the usage of fetch much more convenient in typed code without the need for unnecessary castings and overrides.
This change will not brake any other definitions relying on Body
, Request
and Response
interfaces due to the use of optional generic arguments. Therefore, in current definitions, declare var a: Response
will automatically evaluate to declare var a: Response<any>
thus making the change backward-compatible.
P.S. Creating an issue instead of the pull request because I’m not familiar with WIDL syntax that’s used here and I coudn’t find any explanatory documentation on it.
Issue Analytics
- State:
- Created 5 years ago
- Comments:9 (4 by maintainers)
Top GitHub Comments
The only information i found for editing the files are from here:
Microsoft/TypeScript/blob/master/CONTRIBUTING.md#contributing-libdts-fixes
Microsoft/TSJS-lib-generator#contribution-guidelines
You have to edit the json files at the inputfiles folder.
@sandersn