You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
46 lines
1.3 KiB
46 lines
1.3 KiB
/** |
|
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;
|
|
|