Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Co-authored-by: Sindre Sorhus <sindresorhus@gmail.com>
- Loading branch information
1 parent
bb0d215
commit 0e8f4e3
Showing
4 changed files
with
68 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
/** | ||
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; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
import {IterableElement} from '../source/iterable-element'; | ||
import {expectType} from 'tsd'; | ||
|
||
declare const iterableElement: IterableElement<ReturnType<typeof secretGenerator>>; | ||
expectType<1 | 'two'>(iterableElement); | ||
|
||
declare const iterableElementAsync: IterableElement<ReturnType<typeof secretGeneratorAsync>>; | ||
expectType<true | Date>(iterableElementAsync); | ||
|
||
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type | ||
function * secretGenerator() { | ||
yield 1; | ||
yield 'two'; | ||
} | ||
|
||
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type | ||
async function * secretGeneratorAsync() { | ||
yield true; | ||
yield new Date(); | ||
} |