Я хотел бы начать с того, что делаю эту серию, чтобы лучше изучить и понять Typescript, поэтому не стесняйтесь поправлять меня или обращаться ко мне.
Если у нас есть тип, который является обернутым типом, как Promise. Как мы можем получить тип, который находится внутри обернутого типа?
Давайте рассмотрим пару примеров
type Example1 = Promise<string>
type Example2 = Promise<{ field: number }>
type Example3 = Promise<Promise<string | number>>
type Result1 = MyAwaited<Example1> // string
type Result2 = MyAwaited<Example2> // { field: number }
type Result3 = MyAwaited<Example3> // string | number
Здесь стоит отметить, что мы также должны принимать во внимание вложенные обещания.
Как бы выглядел такой тип?
type MyAwaited<Type> = Type extends Promise<infer K>
? MyAwaited<K> : Type;
Понимание ключевого слова infer
Ключевое слово infer можно использовать в условии в условном типе, чтобы поместить вычисляемый тип в переменную. Затем эта переменная может быть использована в условных ветвях.
Давайте разберем это на примере:
Type extends Promise<infer K>
Здесь мы проверяем, расширяет ли Type тип Promise, и выводим тип, который обернут внутри.
Если он расширяет его, то есть наш Type имеет тип Promise (например: Promise>), то мы используем рекурсию для повторной проверки MyAwaited<K>
.
если он не расширяет его, то мы просто возвращаем Type.
Спасибо!
Вы можете найти меня здесь Мой Твиттер