47 lines
1.3 KiB
Plaintext
47 lines
1.3 KiB
Plaintext
|
/**
|
||
|
Get the element type of an `Iterable`/`AsyncIterable`. For example, an array or a generator.
|
||
|
|
||
|
This can be useful, for example, if you want to get the type that is yielded in a generator function. Often the return type of those functions are not specified.
|
||
|
|
||
|
This type works with both `Iterable`s and `AsyncIterable`s, so it can be use with synchronous and asynchronous generators.
|
||
|
|
||
|
Here is an example of `IterableElement` in action with a generator function:
|
||
|
|
||
|
@example
|
||
|
```
|
||
|
function * iAmGenerator() {
|
||
|
yield 1;
|
||
|
yield 2;
|
||
|
}
|
||
|
|
||
|
type MeNumber = IterableElement<ReturnType<typeof iAmGenerator>>
|
||
|
```
|
||
|
|
||
|
And here is an example with an async generator:
|
||
|
|
||
|
@example
|
||
|
```
|
||
|
async function * iAmGeneratorAsync() {
|
||
|
yield 'hi';
|
||
|
yield true;
|
||
|
}
|
||
|
|
||
|
type MeStringOrBoolean = IterableElement<ReturnType<typeof iAmGeneratorAsync>>
|
||
|
```
|
||
|
|
||
|
Many types in JavaScript/TypeScript are iterables. This type works on all types that implement those interfaces. For example, `Array`, `Set`, `Map`, `stream.Readable`, etc.
|
||
|
|
||
|
An example with an array of strings:
|
||
|
|
||
|
@example
|
||
|
```
|
||
|
type MeString = IterableElement<string[]>
|
||
|
```
|
||
|
*/
|
||
|
export type IterableElement<TargetIterable> =
|
||
|
TargetIterable extends Iterable<infer ElementType> ?
|
||
|
ElementType :
|
||
|
TargetIterable extends AsyncIterable<infer ElementType> ?
|
||
|
ElementType :
|
||
|
never;
|