| /** |
| 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; |