Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Типы данных в Promise
Promise — это объект JavaScript, который может содержать любой тип данных. Нет ограничений на то, какое значение может быть передано в resolve() или reject().
Любые значения в resolve()
В Promise можно передать:
- Примитивные типы:
// string
new Promise(resolve => resolve("Hello"))
// number
new Promise(resolve => resolve(42))
// boolean
new Promise(resolve => resolve(true))
// null, undefined
new Promise(resolve => resolve(null))
- Объекты и массивы:
const fetchUser = () => new Promise(resolve => {
resolve({ id: 1, name: "John", email: "john@example.com" })
})
const getIds = () => new Promise(resolve => {
resolve([1, 2, 3, 4, 5])
})
- Другие Promise-ы:
const chainedPromise = new Promise(resolve => {
resolve(Promise.resolve("value"))
})
// Автоматически распакуется и вернёт "value"
- Функции и классы:
new Promise(resolve => {
resolve(() => console.log("callback"))
})
new Promise(resolve => {
resolve(class MyClass {})
})
- Символы, Map, Set:
new Promise(resolve => resolve(Symbol("id")))
new Promise(resolve => resolve(new Map()))
new Promise(resolve => resolve(new Set()))
TypeScript типизация
В TypeScript Promise типизируется с помощью generic типа:
// Promise<T> где T — тип значения
const promiseString: Promise<string> = Promise.resolve("hello")
const promiseNumber: Promise<number> = Promise.resolve(42)
const promiseObject: Promise<{id: number}> = Promise.resolve({id: 1})
const promiseArray: Promise<number[]> = Promise.resolve([1, 2, 3])
// Функция, возвращающая Promise
function fetchUser(): Promise<{id: number, name: string}> {
return fetch(/api/user).then(r => r.json())
}
// async/await
async function getUser(): Promise<User> {
const response = await fetch(/api/user)
return response.json()
}
Важные моменты
Распаковка вложенных Promise-ов:
// Если resolve передать Promise, он автоматически распакуется
const promise = new Promise(resolve => {
resolve(Promise.resolve("value"))
})
promise.then(value => console.log(value)) // "value", а не Promise
reject() тоже может быть любой тип:
// Обычно передаём Error
new Promise((resolve, reject) => {
reject(new Error("Something went wrong"))
})
// Но технически можем передать что угодно
new Promise((resolve, reject) => {
reject("error string")
reject({code: 404})
reject(42)
})
Лучшие практики
- Используй типизацию — в TypeScript явно указывай тип данных в Promise<T>
- Передавай объекты — лучше resolve({status: "ok", data}) чем resolve("ok")
- В reject передавай Error — для удобной обработки ошибок
- Избегай вложенных Promise-ов — используй async/await
Frontend контекст
В реальных приложениях часто встречаются:
// API запрос — возвращает Promise<T>
const getQuestions = (): Promise<Question[]> =>
fetch(/api/questions).then(r => r.json())
// Загрузка изображения
const loadImage = (url: string): Promise<HTMLImageElement> =>
new Promise((resolve, reject) => {
const img = new Image()
img.onload = () => resolve(img)
img.onerror = () => reject(new Error("Failed to load"))
img.src = url
})
Основная идея: Promise — контейнер для любого типа данных, который будет доступен позже (асинхронно).