← Назад к вопросам

Какой тип данных передается в Promise?

1.0 Junior🔥 61 комментариев
#JavaScript Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Типы данных в Promise

Promise — это объект JavaScript, который может содержать любой тип данных. Нет ограничений на то, какое значение может быть передано в resolve() или reject().

Любые значения в resolve()

В Promise можно передать:

  1. Примитивные типы:
// 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))
  1. Объекты и массивы:
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])
})
  1. Другие Promise-ы:
const chainedPromise = new Promise(resolve => {
  resolve(Promise.resolve("value"))
})
// Автоматически распакуется и вернёт "value"
  1. Функции и классы:
new Promise(resolve => {
  resolve(() => console.log("callback"))
})

new Promise(resolve => {
  resolve(class MyClass {})
})
  1. Символы, 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 — контейнер для любого типа данных, который будет доступен позже (асинхронно).