TypeScript, статически типизированная расширенная версия JavaScript, предоставляет мощные возможности вывода типов, которые позволяют разработчикам выявлять ошибки во время компиляции. При работе с асинхронными операциями система типов TypeScript может помочь нам извлечь и использовать базовые типы из промисов. В этой статье мы рассмотрим несколько методов извлечения типов из промисов в TypeScript, сопровождаемые примерами кода.
Метод 1: введите вывод, используя typeofи Promise.resolve()
const promise = Promise.resolve(42);
type PromiseType = typeof promise extends Promise<infer T> ? T : never;
Объяснение:
Используя оператор typeofс функцией Promise.resolve(), мы можем вывести тип разрешенного значения Tиз объект promise. Условный тип Promise<infer T> ? T : neverгарантирует, что, если тип является обещанием, мы извлекаем разрешенный тип T; в противном случае мы возвращаем never.
Метод 2: использование ReturnTypeи typeof
async function fetchData(): Promise<string> {
// Fetch data from an API
}
type PromiseReturnType<T> = T extends (...args: any[]) => Promise<infer R> ? R : never;
type ResultType = PromiseReturnType<typeof fetchData>;
Объяснение:
Используя тип утилиты ReturnType, мы можем извлечь тип возвращаемого значения функции. Объединив его с оператором typeof, мы можем определить тип возвращаемого значения асинхронной функции, например fetchData, и присвоить его ResultType.
Метод 3: развертывание типа с помощью AsyncReturnType(требуется TypeScript 2.8 и более поздних версий)
type AsyncReturnType<T extends (...args: any[]) => Promise<any>> =
T extends (...args: any[]) => Promise<infer R> ? R : any;
async function fetchData(): Promise<string> {
// Fetch data from an API
}
type ResultType = AsyncReturnType<typeof fetchData>;
Объяснение:
Тип AsyncReturnTypeиспользует условные типы для извлечения разрешенного типа Rиз асинхронной функции T. Этот метод предоставляет краткий способ развернуть тип функции, возвращающей обещание.
Метод 4: извлечение разрешенного типа с помощью await(требуется TypeScript 4.4+)
async function fetchData(): Promise<string> {
// Fetch data from an API
}
type ResultType = typeof (await fetchData());
Объяснение:
Начиная с TypeScript 4.4 оператор awaitможно использовать непосредственно в аннотациях типов. Заключив выражение awaitв круглые скобки и применив оператор typeof, мы можем извлечь разрешенный тип обещания.
TypeScript предлагает несколько методов извлечения типов из промисов, предоставляя разработчикам повышенную безопасность типов и улучшенное качество кода. В этой статье мы рассмотрели четыре различных метода: определение типа с использованием typeofи Promise.resolve(), использование ReturnTypeи typeof, разворачивание типа с помощью AsyncReturnTypeи извлечение разрешенного типа с помощью await. Используя эти методы, разработчики могут оптимизировать свой код и обеспечить правильность типов в асинхронных операциях.
Не забудьте использовать соответствующий метод в зависимости от вашей версии TypeScript и требований проекта.