Definitelytyped: bluebird 3.0: ๊ธ€๋กœ๋ฒŒ Promise์˜ ์˜ค๋ฒ„๋กœ๋“œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์— ๋งŒ๋“  2016๋…„ 08์›” 24์ผ  ยท  44์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: DefinitelyTyped/DefinitelyTyped

์•ˆ๋…• ๋ชจ๋‘๋“ค!

์ €๋Š” ์ „์—ญ Promise ๊ฐ์ฒด๋ฅผ ๋Œ€์ฒดํ•˜๊ธฐ ์œ„ํ•ด bluebird๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. typedef๋ฅผ @lhecker ์— ์˜ํ•ด ๊ฒŒ์‹œ๋œ ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. global Promsie ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด์ œ ์˜ค๋ฒ„๋กœ๋“œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์ด์ „ ํ–‰๋™์„ ์–ด๋–ป๊ฒŒ ๋‹ฌ์„ฑํ•ฉ๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด bluebird-global.d.ts๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„,

@types/bluebird-global ์„(๋ฅผ) ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํƒ€์ดํ•‘์€ ๋ณด๋‹› ์•„๋ž˜์— @types/bluebird@^3.0 ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ธ€๋กœ๋ฒŒ Promise ์—์„œ ๋ธ”๋ฃจ๋ฒ„๋“œ์˜ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค(์ฆ‰, ts ์ปดํŒŒ์ผ์ด ์‹คํŒจํ•˜์ง€ ์•Š์Œ).

์‚ฌ์šฉ ๋ฐฉ๋ฒ•์„ ๋ณด๋ ค๋ฉด ์ด๊ฒƒ์„ ์ฝ์œผ์‹ญ์‹œ์˜ค.

๋ชจ๋“  44 ๋Œ“๊ธ€

๊ธ€์Ž„์š” IMHO์˜ ์ด์ „ Bluebird ์ •์˜๋„ ์ข‹์€ ์†”๋ฃจ์…˜์ด ์•„๋‹ˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ „์—ญ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ๋งŽ์ด ๋ˆ„์ถœ๋˜์—ˆ๊ณ  ์ค‘๋ณต ์ž‘์—…์„ ์ค„์ด๋Š” ๊ฒƒ์ด ์ข‹์€ ์•„์ด๋””์–ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด์ „ ์ •์˜๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์€ declare var Promise: PromiseConstructor; ๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐ˜๋ฉด PromiseConstructor ๋Š” ์ด์ „(์ „์—ญ์ ์œผ๋กœ ์ •์˜๋œ) Bluebird ์ธํ„ฐํŽ˜์ด์Šค์˜€์Šต๋‹ˆ๋‹ค.

์ฆ‰, ๋กœ์ปฌ *.d.ts ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  ์ด์™€ ๊ฐ™์€ ๊ฒƒ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

import Bluebird = require("bluebird");
declare var Promise: Bluebird<any>;

์•„๋งˆ๋„ ์ž‘๋™ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋ถˆํ–‰ํ•˜๊ฒŒ๋„. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑ๋œ ์ฝ”๋“œ๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

declare function doLoadData(): Promise<Data>

๋ณด์‹œ๋‹ค์‹œํ”ผ ํ•จ์ˆ˜๋Š” Promise<T> ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” bluebird๊ฐ€ ์•„๋‹Œ ํ‘œ์ค€ Promsie ์ž…๋‹ˆ๋‹ค. var Promise: Bluebird<any> ์„ ์–ธ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์•„๋‹Œ ํ‘œ์ค€ Promise ์ƒ์„ฑ์ž๋ฅผ ์˜ค๋ฒ„๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ด์œ ๋กœ 2.0 ํƒ€์ดํ•‘์œผ๋กœ ๋‹ค์‹œ ์ „ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

@Strate ์•„ ์  ์žฅ, ์ด๊ฒƒ์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜๊ณ  ๋ฌด์—‡์„ ํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ๊ธด ์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ผ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ œ์ถœ์„ ๊นœ๋นกํ•ด์„œ ๊ฒฐ๊ตญ ์žƒ์–ด๋ฒ„๋ ธ๋„ค์š”...

๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ด ๋ฌธ์ œ๋ฅผ ๊ฒช๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. https://github.com/d-ph/typescript-bluebird-as-global-promise

์ž์‹ ๋ณต์ œ && npm install && npm run tsc

๋ฌธ์ œ:
ํƒ€์‚ฌ d.ts ํŒŒ์ผ์€ Promise ์— ๋Œ€ํ•ด ์ž…๋ ฅ๋ฉ๋‹ˆ๋‹ค. ์ด Promise ๋Š” typescript์˜ lib.es6.d.ts ( "target": "es6" ๋•Œ) ๋˜๋Š” ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(์˜ˆ: core-js , typescript๋กœ es5๋กœ ์ปดํŒŒ์ผํ•  ๋•Œ ๋งค์šฐ ์ธ๊ธฐ ์žˆ์Œ)์— ์˜ํ•ด ์ •์˜๋ฉ๋‹ˆ๋‹ค. . ์ตœ์‹  bluebird.d.ts ๋Š” ์ „์—ญ Promise ๋กœ ์„ ์–ธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. bluebird.js๊ฐ€ ์ž์‹ ์„ ์ „์—ญ Promise ๋กœ ๋…ธ์ถœํ•˜๋”๋ผ๋„.

๊ฒฐ๊ณผ:
๊ฐœ๋ฐœ์ž๋Š” ํƒ€์‚ฌ ์ฝ”๋“œ์—์„œ ๋ฐ˜ํ™˜๋œ ์•ฝ์†์—์„œ ๋ธ”๋ฃจ๋ฒ„๋“œ์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(์ปดํŒŒ์ผ ์‹คํŒจ).

์˜ˆ์ƒ ๊ฒฐ๊ณผ:
๊ฐœ๋ฐœ์ž๋Š” ํƒ€์‚ฌ ์ฝ”๋“œ์—์„œ ๋ฐ˜ํ™˜๋œ ์•ฝ์†์—์„œ ๋ธ”๋ฃจ๋ฒ„๋“œ์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ปดํŒŒ์ผ ์„ฑ๊ณต).

๋ˆ„๊ฐ€ ๋ธ”๋ฃจ๋ฒ„๋“œ ํƒ€์ดํ•‘์˜ ๊ด€๋ฆฌ์ž์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. @lhecker , ๋‹น์‹ ์€ git blame ์— ์˜ํ•ด ๋ฐ˜ํ™˜๋˜๋Š” ๋ถˆ์šดํ•œ ์‚ฌ๋žŒ์ž…๋‹ˆ๋‹ค. ์œ„์—์„œ ๋งํฌํ•œ github ํ”„๋กœ์ ํŠธ๊ฐ€ ์ปดํŒŒ์ผ๋˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ธ”๋ฃจ๋ฒ„๋“œ ํƒ€์ดํ•‘์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์•Œ๋ ค์ฃผ์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

ํ˜„์žฌ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:

  1. ๊ฐ€์žฅ ๋”๋Ÿฌ์šด. ์ ˆ๋Œ€ ๋ธ”๋ฃจ๋ฒ„๋“œ๋ฅผ ๊ฐ€์ ธ์˜ค์ง€ ๋ง๊ณ  ๋ธ”๋ฃจ๋ฒ„๋“œ ํƒ€์ดํ•‘์„ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. bluebird Promise ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ Promise["config"]({}); Promise.resolve("foo")["finally"](() => { console.log("lol"); }) ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์นจ๋ฌต์‹œํ‚ต๋‹ˆ๋‹ค. ์ฆ‰, ๋ฐฐ์—ด ์•ก์„ธ์Šค ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. [""]
  2. ๋”๋Ÿฝ๊ณ  ์งœ์ฆ๋‚˜. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ชจ๋“  ํ•ญ๋ชฉ ts ํŒŒ์ผ์— ๋‹ค์Œ ๋‘ ์ค„์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
import * as Bluebird from 'bluebird';
declare global { export interface Promise<T> extends Bluebird<T> {} }

Bluebird์˜ ์ •์  ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ $#$ Promise.config({}) Bluebird.config({}) ๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

๋‹จ์ ์€ IDE๊ฐ€ ์ด ํ•ดํ‚น์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ•ด์„ํ•˜๋Š” ๋ฐ ์–ด๋ ค์›€์„ ๊ฒช๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ ... ์—ฌ๋Ÿฌ๋ถ„ ๋ชจ๋‘๊ฐ€ ์ €์™€ ๋‹ค๋ฅธ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ํ•˜์ง€ ์•Š๋Š” ๋ฐฉ์‹์œผ๋กœ Bluebird๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ๋ถ„์ด ์ด๊ฒƒ์— ๋ฌธ์ œ๋ฅผ ๊ฒช์„ ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์€ ์ €์—๊ฒŒ๋Š” ๋‹ค์†Œ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ผ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์ œ๊ฐ€ ์ง์ ‘ ํƒ€์ดํ•‘๋„ ์•ˆ์ผ์–ด์š”! ์—ฌ๊ธฐ ์—์„œ 3.0์— ๋Œ€ํ•œ ์œ ์ผํ•œ ๊ธฐ์กด ํ•ญ๋ชฉ์„ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค. 3.0์— ๋Œ€ํ•ด ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ์ด ์—†๋Š” ๊ฒƒ๋ณด๋‹ค ๋‚ซ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ฃ ?

๋ฌธ์ œ๋Š” ํ˜„์žฌ TypeScript๊ฐ€ ํ–ฅํ•˜๊ณ  ์žˆ๋Š” ๋ฐฉํ–ฅ์ด ๋ถ„๋ช…ํžˆ modules > globals ๋ผ๋Š” ์ ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์ œ๊ฐ€ ์ •๋ง๋กœ ์ฐฌ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ๋˜ํ•œ ๋ชจ๋“ˆ์ด ์ „์—ญ ๊ฐœ์ฒด๋ฅผ ์ˆ˜์ •ํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ Bluebird ๊ฐ€ ๋ชจ๋“  ๊ฒฝ์šฐ์— ์ „์—ญ Promise ๋ฅผ ๋Œ€์ฒด ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜๋Š” ๊ฒฝ์šฐ์— ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค! ๋˜๋Š” ๊ทธ๋ ‡๊ฒŒ ํ‘œํ˜„ํ•˜๋ ค๋ฉด:

Promise.noConflict() ๋ฅผ ๋ง ๊ทธ๋Œ€๋กœ ์ฝ”๋“œ์˜ ์•„๋ฌด ๊ณณ์—์„œ๋‚˜ ํ˜ธ์ถœํ•˜๋ฉด "์œ ํ˜• ์•ˆ์ „์„ฑ"์€ ์–ด๋–ป๊ฒŒ ๋ฉ๋‹ˆ๊นŒ? tsc ๊ฐ€ ๋ชจ๋“  ๊ฒƒ์ด ๊ดœ์ฐฎ๋‹ค๊ณ  ๋งํ•˜๋”๋ผ๋„ ์ „์—ญ Promise ์œ ํ˜•์„ ์›๋ž˜ ์œ ํ˜•์œผ๋กœ ๋˜๋Œ๋ฆฌ๊ณ  ์ฝ”๋“œ ์ถฉ๋Œ์„ ์ผ์œผํ‚ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋„ค... @d-ph. ๋‘ ๋ฒˆ์งธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์˜ ์ •์‹ ์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•ญ์ƒ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ์ด์ƒ์ ์ธ ์†”๋ฃจ์…˜์ผ ๋ฟ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—๋Š” _ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค_. ๋‚˜๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์‹œ์Šคํ…œ์ด ์ตœ์†Œํ•œ ์ „์—ญ Promise ๊ฐœ์ฒด๋ฅผ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๊ณ  2.0์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ํ•ด๋‹น ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•ด ์ผ์น˜ํ•˜๋Š” ์œ ํ˜•์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ TypeScript์˜ ์ด๋ฐ์˜ฌ๋กœ๊ธฐ์— ๋น„์ถ”์–ด ๊ธ€๋กœ๋ฒŒ Promise ์œ ํ˜•์„ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์€ _๋งค์šฐ_ ์‹ ์ค‘ํ•˜๊ฒŒ( noConflict() ๋ฌธ์ œ ๋“ฑ์„ ๊ธฐ์–ตํ•ด์•ผ ํ•จ), ๊ทธ๋Ÿด ๊ฒฝ์šฐ์—๋งŒ ์˜ตํŠธ์ธํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

IMO ์•ž์œผ๋กœ์˜ ๋ฐฉ๋ฒ•์€ bluebird.d.ts ํŒŒ์ผ์— ์žˆ๋Š” ๋™์ผํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์„ ์–ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ „์—ญ Promise ๊ฐœ์ฒด๋ฅผ ํ™•์žฅํ•˜๋Š” ์ผ์ข…์˜ bluebird-global.d.ts (๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ) ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ๋“ค์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ํ•ญ์ƒ ํฌํ•จํ•˜๋Š” ๋Œ€์‹  ๋ช…์‹œ์ ์œผ๋กœ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€, ํŠนํžˆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์•ˆ์ „ํ•œ _๋ฐ_ ์˜ฌ๋ฐ”๋ฅธ ์ž…๋ ฅ์„ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ „์—ญ Promise ๋ฅผ ๋ฎ์–ด์“ฐ๋Š” ์ถ”๊ฐ€ ์ด์ ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์•„์ด๋””์–ด๊ฐ€ ์ข‹์€ ์•„์ด๋””์–ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์—ฌ์œ  ์‹œ๊ฐ„์ด ์žˆ๋‹ค๋ฉด PR์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๊ทธ๋Ÿฌํ•œ ๊ธฐ์—ฌ์— ๋Œ€ํ•ด ์ •๋ง๋กœ ๊ธฐ๋ปํ•  ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ™‚

๋‚˜๋Š” ์‹œ๊ฐ„์ด ๋ถ€์กฑํ•˜๊ณ  ํ˜„์žฌ ๊ทธ๋Ÿฐ ํƒ€์ดํ•‘์ด ํ•„์š”ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ ๊ทธ๋Ÿฐ ํƒ€์ดํ•‘์„ ์“ธ ์ˆ˜ ์žˆ๋Š” ์œ„์น˜์— ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฐ ์‹์œผ๋กœ ํ‘œํ˜„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@lhecker ๋‚˜๋Š” ๋‹น์‹ ์—๊ฒŒ ๋™์˜ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์šฐ๋ฆฌ๊ฐ€ ๋ธ”๋ฃจ๋ฒ„๋“œ์— ๋Œ€ํ•œ Promise์˜ ์ „์—ญ ์žฌ์ •์˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ์‹ค์ œ ์„ธ๊ณ„๊ฐ€ ์•„๋‹Œ typescript ์ปดํŒŒ์ผ๋Ÿฌ๋งŒ ํ•ดํ‚นํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Promise ์žฌ์ •์˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด typescript๋Š” fetch ๊ฐ€ bluebird์˜ ๊ฒƒ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

import `whatwg-fetch`;
let result = fetch("anyurl"); // this is NOT bluebird promise, but typescript think that it is.

fetch ๋ฅผ bluebird์˜ Promise.resolve ๋กœ ๋ž˜ํ•‘ํ•˜์ง€ ์•Š์œผ๋ฉด $#$ result ์— ๋Œ€ํ•œ .finally ๋ฉ”์†Œ๋“œ๋ฅผ ์–ป์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

import `whatwg-fetch`;
fetch("anyurl").then().finally() // goes to runtime error with overriden global promise, but should be compile error.

๋”ฐ๋ผ์„œ ๊ฐ ์‚ฌ์šฉ์— ๋Œ€ํ•ด ๋ช…์‹œ์ ์œผ๋กœ bluebird ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ๋” ๋‚˜์€ ์†”๋ฃจ์…˜์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

import Promise from "bluebird";
import `whatwg-fetch`;
Promise.resolve(fetch("anyurl")).then().catch() // no compile error, no runtime error

๋‚ด ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@lhecker๋‹˜ , ๋‹ต๋ณ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์ด ๋งํ•œ ๋ชจ๋“  ๊ฒƒ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ €๋Š” @Strate ์˜ Promise.resolve() ๋ฉ”์„œ๋“œ๋กœ ํƒ€์‚ฌ ์ฝ”๋“œ๋ฅผ ๋ž˜ํ•‘ํ•˜์—ฌ es6 ์•ฝ์†์„ Bluebird(๋˜๋Š” Bluebird๋ฅผ Bluebird๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ)๋ฅผ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ €๋Š” Bluebird์˜ ์•ฝ์†์„ ๋Ÿฐํƒ€์ž„์— ์ „์—ญ์ ์œผ๋กœ ์œ ์ง€ํ•˜๊ณ  ์‹ถ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ ‡๊ฒŒ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ํƒ€์‚ฌ ์ฝ”๋“œ์— ์˜์กดํ•  ํ•„์š”๊ฐ€ ์—†์ง€๋งŒ ์ด๋Š” ์š”์ ์„ ๋ฒ—์–ด๋‚ฉ๋‹ˆ๋‹ค.

์ œ๋Œ€๋กœ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชฐ๋ž๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์ด ๋ฌธ์ œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ๋ฌธ์„œ๊ฐ€ ๋„์›€์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์€ ๋ธŒ๋ผ์šฐ์ € ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์„ธ๊ณ„(nodejs/typescript์™€ ๋ฐ˜๋Œ€)์—์„œ ์˜ค๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ›„์— ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

  1. npm install <absolutely everything that uses es6 promise>
  2. npm install bluebird @types/bluebird
  3. typescript์™€ ํ•จ๊ป˜ ํƒ€์‚ฌ ์ฝ”๋“œ ์‚ฌ์šฉ

๋˜ํ•œ ๋‚˜์ค‘์— ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋„๋ก ์ด "์ œ3์ž ์ฝ”๋“œ๊ฐ€ es6 Promise์— ๋Œ€ํ•ด ์ž…๋ ฅ๋œ ๊ฒฝ์šฐ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•" ์„น์…˜์ด ๋ฌธ์„œํ™”๋˜์–ด ์žˆ์œผ๋ฉด ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰

import * as Bluebird from 'bluebird';
declare global { export interface Promise<T> extends Bluebird<T> {} }

๊ทธ๋ฆฌ๊ณ 

import * as Promise from 'bluebird';
import { Observable } from "rxjs";

let observable = Promise.resolve(new Observable<number>().toPromise());

readme ๋˜๋Š” bluebird.d.ts ํŒŒ์ผ ์ƒ๋‹จ์˜ ๋ฌธ์„œ ๋ธ”๋ก์—์„œ.

์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•ด?

Promise ์˜ ์ „์—ญ ์žฌ์ •์˜์—์„œ bluebird ๊ฒƒ์œผ๋กœ ์ด๋™ํ•˜๋Š” ์ž‘์—…์„ ์™„๋ฃŒํ–ˆ์œผ๋ฉฐ ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ bluebird์˜ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋˜์—ˆ๋˜ ES6 Promise๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ ์›€์ง์ž„์œผ๋กœ ๋‚ด ์ฝ”๋“œ๋ฒ ์ด์Šค๋„ ์ •๋ฆฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Promise ์˜ ๊ธ€๋กœ๋ฒŒ ์˜ค๋ฒ„๋กœ๋”ฉ์—์„œ ๋ฒ—์–ด๋‚˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ฑด๋ฐฐ :)

๋‚˜๋Š” modules > globals ๋ฅผ ์ดํ•ดํ•˜์ง€๋งŒ ๋…ผ์Ÿ(๋ฐ/๋˜๋Š” ํ˜„์‹ค)์„ ์œ„ํ•ด ๋‚ด๊ฐ€ ๋Œ€ํ˜• ๋ธŒ๋ผ์šฐ์ € SPA์—์„œ ์ž‘์—…ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ Bluebird๋ฅผ Promise ํด๋ฆฌํ•„๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ž„๋ฌด๋ฅผ ๋ฐ›์•˜๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

@d-ph์˜ ๋‚ด์šฉ์œผ๋กœ @lhecker ๊ฐ€ ์ œ์•ˆํ•œ bluebird-global.d.ts ์ˆ˜์ •์„ ์‹œ๋„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

import * as Bluebird from 'bluebird';
declare global { export interface Promise<T> extends Bluebird<T> {} }

$ typings/modules/bluebird-global/index.d.ts typings ๋ฅผ ํ†ตํ•ด ์„ค์น˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

// Generated by typings
// Source: src/bluebird-global.d.ts
declare module 'bluebird-global' {
// via https://github.com/DefinitelyTyped/DefinitelyTyped/issues/10801
import * as Bluebird from 'bluebird';
global { export interface Promise<T> extends Bluebird<T> {} }
}

๊ทธ๋Ÿฌ๋‚˜ ๋ชจ๋“  ๊ฒƒ์„ ๋นŒ๋“œํ•˜๋ ค๊ณ  ํ•˜๋ฉด TypeScript(v1.8.2)๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ถˆํ‰ํ•ฉ๋‹ˆ๋‹ค.

ERROR in /path/to/typings/modules/bluebird-global/index.d.ts
(6,27): error TS2665: Module augmentation cannot introduce new names in the top level scope.

ERROR in /path/to/src/bluebird-global.d.ts
(2,35): error TS2665: Module augmentation cannot introduce new names in the top level scope.

global-modifying-module.ts ์— ๋Œ€ํ•œ MS ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค.
https://www.typescriptlang.org/docs/handbook/declaration-files/templates/global-modifying-module-d-ts.html

๊ทธ๋ฆฌ๊ณ  ์ด ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์™€ ๊ด€๋ จ๋œ TS ๋ฌธ์ œ
https://github.com/Microsoft/TypeScript/issues/6722

๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๋‚ด๊ฐ€ ํ•ด์•ผ ํ•  ์ผ์„ ์žƒ์–ด๋ฒ„๋ ธ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฌ๋“ ์ง€ ๋„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์•ˆ๋…•.

๋ฌธ์ œ์™€ ํ•ด๊ฒฐ์ฑ…์„ ๋ณด์—ฌ์ฃผ๋Š” ๋‚ด repo๋ฅผ ํ™•์ธํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๋งํฌ . ์ œ 3์ž์˜ ๋ชจ๋“  ์•ฝ์†์„ bluebird์˜ Promise ์ƒ์„ฑ์ž๋กœ ๋ž˜ํ•‘ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•  ๋•Œ๊นŒ์ง€ ์ €๋Š” ๊ทธ๊ฒƒ์— ๋งค์šฐ ๋งŒ์กฑํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ œ๊ฐ€ ์ง€๊ธˆ ํ•˜๋Š” ์ผ์ž…๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ์ •๋ณด์˜ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•œ ํ›„์—๋Š” ์ปดํŒŒ์ผํ•  ์ˆ˜ ์—†์ง€๋งŒ ์ฃผ์„ ์ฒ˜๋ฆฌ๋ฅผ ์ œ๊ฑฐํ•œ ํ›„์—๋Š” ํ™•์ธํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

// declare global {
//     export interface Promise<T> extends Bluebird<T> {}
// }

๊ทธ๊ฒƒ์€ ์ปดํŒŒ์ผ?

๋‚ด repo๋Š” TS 2(์ง€๊ธˆ์€ ์•ˆ์ •์ ์ž„)๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋‹น์‹ ์€ 1.8.2๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. TS๋ฅผ 2๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋ฉด ์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚˜๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ๋‚ด ์†”๋ฃจ์…˜์„ ์ „์—ญ d.ts ํŒŒ์ผ์— ๋„ฃ๋Š” ๋ฐ ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋‚ด webpack ์ปดํŒŒ์ผ์˜ ๋ชจ๋“  ์ง„์ž…์ ์— ์ถ”๊ฐ€ํ•˜์—ฌ ๊ฒฐ๊ตญ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์˜ js ์„ค์ •์„ ๋ชจ๋ฅด์ง€๋งŒ ์ปดํŒŒ์ผ ์ค‘์— ์‹คํŒจํ•˜๋Š” ๋ชจ๋“  ํŒŒ์ผ(๋˜๋Š” ๊ทธ ์ค‘ ์ ์–ด๋„ ํ•˜๋‚˜)์— ๋‚ด ์ˆ˜์ • ์‚ฌํ•ญ์„ ๋„ฃ๊ณ  ๋„์›€์ด๋˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋˜ํ•œ Bluebird์˜ Promise ๊ตฌํ˜„์„ ์ „์—ญ Promise ๋กœ "๋“ฑ๋ก"ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ์ด ์Šค๋ ˆ๋“œ ์ „์ฒด๋ฅผ ์ฝ์—ˆ์ง€๋งŒ ํ•œ ๋ถ€๋ถ„์„ ๋”ฐ๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์—ฌ์ „ํžˆ ๊ธฐ๋ณธ(์˜ˆ: Bluebird๊ฐ€ ์•„๋‹Œ) Promise ๊ตฌํ˜„์„ ๋ฐ˜ํ™˜ํ•  ๊ฒƒ์ž„์„ ์ œ์•ˆํ•˜๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ์ œ3์ž ์ฝ”๋“œ๊ฐ€ ์ „์—ญ ์ˆ˜์ค€์—์„œ Bluebird ๊ตฌํ˜„์œผ๋กœ ๋Œ€์ฒด๋œ Promise ์ƒ์„ฑ์ž( new Promise(...) )๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

<script src="//.../bluebird.min.js"></script>
<script>
    var promise = fetch("some url");

   promise.finally(...); 
</script>

๊ธฐ๋ณธ Promise ๊ตฌํ˜„์„ ๋Œ€์ฒดํ•œ Bluebird๋ฅผ ํฌํ•จํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•ด์•ผ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

๋งˆ์ง€๋ง‰์œผ๋กœ, ๋Ÿฐํƒ€์ž„์— ์ด ์ „์ฒด ์ „์—ญ ๊ต์ฒด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ TypeScript์— ์ด๋ฅผ ์•Œ๋ ค ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ๋ชจ๋“  Promise๋„ Bluebird๋กœ ๊ต์ฒด๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋ฌด์—‡์„ ๋†“์น˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

๋งŒ์•ฝ ๋‹น์‹ ์ด dist ๋ฒ„์ „์˜ bluebird๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด(๋‹น์‹ ์ด ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค), ๊ธ€๋กœ๋ฒŒ Promise๋Š” ์ด์ œ Bluebird์ด๊ธฐ ๋•Œ๋ฌธ์— ์ œ3์ž ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” Bluebird๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋ถ€๋ถ„์ด ๋งž์Šต๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์€ Bluebird์˜ node.js ์‚ฌ์šฉ๋ฒ•์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅด๊ฒŒ ์–ธ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค.

์ด ์ „์ฒด ์Šค๋ ˆ๋“œ๋Š” ts๋ฅผ ๊ทธ ๊ฐ€์ •(๊ธ€๋กœ๋ฒŒ Promise๋Š” Bluebird์ž„)์œผ๋กœ ์ปดํŒŒ์ผํ•˜๋Š” ๊ทธ๋‹ค์ง€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์€ ๋ฐฉ๋ฒ•์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. (์˜ˆ๋ฅผ ๋“ค์–ด declare global {} ๋ฅผ ํ†ตํ•ด) ๊ทธ๊ฒƒ์„ ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค๋ฉด, ๋‹น์‹ ์€ ๋๋‚œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@d-ph ํ•˜์ง€๋งŒ ์ œ ๊ฒฐ๋ก ์€ ํ•œ ๋ฒˆ์ด ์•„๋‹ˆ๋ผ ๋ชจ๋“  *.ts ํŒŒ์ผ์—์„œ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งž๋‚˜์š”? ์•„๋งˆ๋„ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ตœ์ข… "ํ•ด๊ฒฐ์ฑ…"์— ๋Œ€ํ•œ ์š”์•ฝ์ด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. :)

์˜ˆ, ์—ฌ๊ธฐ์—๋Š” ๊ฐ„๋‹จํ•œ just copy&paste this line to your X file and everyone and their dog are happy now ์ข…๋ฅ˜์˜ ์†”๋ฃจ์…˜์ด ์—†์Šต๋‹ˆ๋‹ค. ์•„๋‹ˆ๋ฉด ์ ์–ด๋„ ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋งˆ์ง€๋ง‰์œผ๋กœ ๋‹น์‹ ์„ ํ™•์ธํ–ˆ์„ ๋•Œ:

  1. import * as Bluebird from 'bluebird'; declare global { export interface Promise<T> extends Bluebird<T> {} } ํ–‰์„ ๋ชจ๋“  ์ง„์ž…์  *.ts ํŒŒ์ผ์— ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ๋„ฃ๊ฑฐ๋‚˜
  2. Bluebird์˜ ์ƒ์„ฑ์ž ํ•จ์ˆ˜์—์„œ ํƒ€์‚ฌ ์ฝ”๋“œ์—์„œ ๋ฐ˜ํ™˜๋œ ๋ชจ๋“  Promise๋ฅผ ๋ž˜ํ•‘ํ•ฉ๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„์—๋Š” ์•„๋ฌด ๊ฒƒ๋„ ํ•˜์ง€ ์•Š์œผ๋ฉฐ(๋ถˆํ•„์š”ํ•œ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฒ„ํ—ค๋“œ ์ œ์™ธ) ์ปดํŒŒ์ผ ์‹œ๊ฐ„์—๋Š” TS๋ฅผ ๋งŒ์กฑ์Šค๋Ÿฝ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋‹ค์‹œ, ์†”๋ฃจ์…˜ 1. ๋ชจ๋“  ํŒŒ์ผ์ด ์•„๋‹ˆ๋ผ ์ง„์ž…์  ํŒŒ์ผ์—๋งŒ ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ ์–ด๋„ ์ด๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค (webpack + Awesome-typescript-loader).

๋ง ๊ทธ๋Œ€๋กœ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•œ ํŒŒ์ผ์— ํ•œ ์ค„๋งŒ ๋„ฃ์–ด์•ผ ํ•˜๋Š” ๋‹ค๋ฅธ ์†”๋ฃจ์…˜์„ ์ฐพ์œผ๋ฉด ์ปค๋ฎค๋‹ˆํ‹ฐ์™€ ๊ณต์œ ํ•˜์‹ญ์‹œ์˜ค ;p

@d-ph ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค -- "๋ชจ๋“  ์ง„์ž…์  *.ts ํŒŒ์ผ"์ด ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์‘. "์ง„์ž…์ " .ts ํŒŒ์ผ์€ <script> ํƒœ๊ทธ๋ฅผ ํ†ตํ•ด html์— ๋กœ๋“œํ•˜๋Š” .ts ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์ปดํŒŒ์ผ์ด ์‹œ์ž‘๋˜๋Š” ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.

์ง€๊ธˆ ๋น ๋ฅธ ์ธํ„ฐ๋„ท ๊ฒ€์ƒ‰ ๋์— ์ด๊ฒƒ์„ ์ฐพ์•˜ ์Šต๋‹ˆ๋‹ค (์ฝ๋Š” ๊ฒƒ์„ ๊ท€์ฐฎ๊ฒŒ ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค). ๊ฒฐ๋ก ์€ bluebird.d.ts์— global { export interface Promise<T> extends Bluebird<T> {} } ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ถ”๊ฐ€ํ•˜๋ฉด ๋‹ค๋ฅธ ๊ณณ์—์„œ ๋‹ค์‹œ ์–ธ๊ธ‰ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ํ…Œ์ŠคํŠธํ•  ์‹œ๊ฐ„์ด ์—†์ง€๋งŒ ์ œ๊ฐ€ ๋งŒ๋“  ํ…Œ์ŠคํŠธ github repo๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ณด๋‹ˆ ์ž˜ ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ฆ‰, bluebird.d.ts๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ๋‹ค์Œ์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

// Generated by typings
// Source: bluebird.d.ts
declare module 'bluebird' {
// Type definitions for Bluebird v3.x.x
// Project: http://bluebirdjs.com

class Bluebird<R> implements Bluebird.Thenable<R>, Bluebird.Inspection<R> {

์ด์—:

// Generated by typings
// Source: bluebird.d.ts
declare module 'bluebird' {
// Type definitions for Bluebird v3.x.x
// Project: http://bluebirdjs.com

global { export interface Promise<T> extends Bluebird<T> {} }

class Bluebird<R> implements Bluebird.Thenable<R>, Bluebird.Inspection<R> {

๋ถ„๋ช…ํžˆ ์ด๊ฒƒ์€ ์ด์ƒ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŠนํžˆ @types/bluebird (์‚ฌ์šฉ์ž ์ •์˜ ํ•ดํ‚น๋œ bluebird.d.ts๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ง€๊ธˆ ์ œ๊ฑฐํ•ด์•ผ ํ•จ)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์ง€๋งŒ...

๊ทธ๋ž˜์„œ ์ด๋ฏธ _stubs.d.ts ํŒŒ์ผ์— ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ–ˆ๊ณ  ํ›จ์”ฌ ๋” ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. finally not exist on Promise ์— ๋Œ€ํ•œ ๋ถˆ๋งŒ์€ ๋” ์ด์ƒ ์—†์ง€๋งŒ ์–ด๋–ค ์ด์œ ๋กœ delay not Existing on Promise ์— ๋Œ€ํ•œ ์˜ค๋ฅ˜๊ฐ€ ๊ณ„์† ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. bluebird.d.ts ๋ฅผ ์ˆ˜์ •ํ•  ํ•„์š”๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์กฐ์‚ฌํ•˜๊ฒ ์ง€๋งŒ ์ด๊ฒƒ์€ ํ›Œ๋ฅญํ•œ ํ•ด๊ฒฐ์ฑ…์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

declare module "bluebird-global" {
    import * as Bluebird from "bluebird";

    global { export interface Promise<T> extends Bluebird<T> { } }
}

ํŽธ์ง‘: delay Promise.delay(2000) ๊ฐ™์ด ์ •์ ์œผ๋กœ ํ˜ธ์ถœํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์œ„์— ๊ฒŒ์‹œํ•œ ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‚ด ํ•จ์ˆ˜๊ฐ€ Promise<T> ๋ฅผ ๋ฐ˜ํ™˜ํ•  ๋•Œ ์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋ฅ˜ TS2322: '๋ธ”๋ฃจ๋ฒ„๋“œ' ์ž…๋ ฅ'์€(๋Š”) '์•ฝ์†' ์œ ํ˜•์— ํ• ๋‹นํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.'.

Promise ๋ฅผ Bluebird ๋กœ ๋ฐ”๊ฟจ๊ธฐ ๋•Œ๋ฌธ์— then ๋“ฑ์„ ์‚ฌ์šฉํ•  ๋•Œ๋งˆ๋‹ค ๋ฐ˜ํ™˜ ๊ฐ’์ด ๋Œ€์‹  Bluebird<T> ์ด๊ธฐ ๋•Œ๋ฌธ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. Promise<T> ์ค‘ .

์—ฌ๊ธฐ ์ด ํ•ดํ‚น์˜ ์ตœ์ข… ๋ฒ„์ „์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์„ ํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€ ์•Š์ง€๋งŒ ๋‹ค๋ฅธ ์˜ต์…˜๋ณด๋‹ค ๋” ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์‚ฌ์šฉ ์ค‘์ธ ๊ฒƒ์„ ๋‹ค์‹œ ๋ฐ˜๋ณตํ•ด์•ผ ํ•˜๋ฉฐ ๋ฐ˜ํ™˜ ์œ ํ˜•์„ $#$ Bluebird Promise ๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹ค๋ฅธ Bluebird ์ •์˜ ํŒŒ์ผ์—์„œ ์ง์ ‘ ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ๋„ฃ์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

_stubs.d.ts

declare module "bluebird-global" {
    import * as Bluebird from "bluebird";

    global {
        export interface Promise<T> extends Bluebird<T> {
            then<U1, U2>(onFulfill: (value: T) => U1 | Bluebird.Thenable<U1>, onReject: (error: any) => U2 | Bluebird.Thenable<U2>): Promise<U1 | U2>;
            then<U>(onFulfill: (value: T) => U | Bluebird.Thenable<U>, onReject: (error: any) => U | Bluebird.Thenable<U>): Promise<U>;
            then<U>(onFulfill: (value: T) => U | Bluebird.Thenable<U>): Promise<U>;
            then(): Promise<T>;

            finally<U>(handler: () => U | Bluebird.Thenable<U>): Promise<T>;
        }
    }
}

๊ธฐ์กด ์ •์˜์™€ ๋งค์šฐ ์œ ์‚ฌํ•˜์ง€๋งŒ Bluebird ๋Œ€์‹  Promise ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ณต์‹ bluebird-global ๋˜๋Š” bluebird-override ์ •์˜๊ฐ€ ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์œผ์…จ๋‹ค๋‹ˆ ๋‹คํ–‰์ž…๋‹ˆ๋‹ค.

์™„์ „์„ฑ์„ ์œ„ํ•ด: @ProTip ์ด ๋งํ–ˆ๋“ฏ์ด bluebird-2.0.d.ts JustWorksTM๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. npm install @types/[email protected] ๋กœ ์„ค์น˜ํ•˜๊ณ  tsconfig.json์˜ compilerOptions.types ์— ์ถ”๊ฐ€ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

{
    "compilerOptions": {
//     (...)
        "types": [
          "bluebird"
        ]
    },
    "include": [
        "src/**/*.ts"
    ]
}

ํ•ด๋‹น .d.ts์™€ ํ˜„์žฌ Bluebird ๋ฒ„์ „(์ฆ‰, 3.x) ๊ฐ„์˜ ์ฐจ์ด์ ์€ ์ˆ˜๋™์œผ๋กœ ํ•ดํ‚นํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

JustWorksTM์˜ ์˜๋ฏธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

a) es5 ๋Œ€์ƒ
b) es6 ๋Œ€์ƒ
c) core-js ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ๋Š” es5 ๋Œ€์ƒ

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋นŒ๋“œ ์„ค์ •(webpack + Awesome-typescript-loader)์„ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด. ๋˜ํ•œ PhpStorm IDE๋Š” ์ „ํ˜€ ํ˜ผ๋™๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ค๋Š˜ ์‹œ๊ฐ„์„ ํ• ์• ํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ์‚ดํŽด๋ณด๊ณ  ์‹ค์ œ๋กœ Microsoft/TypeScript์—์„œ ํ•ด๋‹น ๋‘ ํ‹ฐ์ผ“์„ ์ƒ์„ฑ/์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. https://github.com/Microsoft/TypeScript/issues/10178 ๋ฐ https://github.com/Microsoft/TypeScript /์ด์Šˆ/12382 . ๋‚ด ์ƒ๊ฐ์€ ๋‹น์‹ ์ด ๋งํ–ˆ๋“ฏ์ด (๊ทธ๋ฆฌ๊ณ  ๋‹น์‹ ๋ณด๋‹ค ๋จผ์ €) bluebird-global.d.ts ํŒŒ์ผ์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ค‘๋ณต ์ฝ”๋“œ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘๋™ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค.

// bluebird-global.d.ts

import * as Bluebird from "bluebird";

export as namespace Promise;
export = Bluebird;

์•ž์„œ ์–ธ๊ธ‰ํ•œ ๋‘ ํ‹ฐ์ผ“์ด ํ•ด๊ฒฐ๋˜๊ฑฐ๋‚˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์€ ๊ฒฝ์šฐ์— ํ•œํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๋™์•ˆ ๋ธŒ๋ผ์šฐ์ €์šฉ์œผ๋กœ ์ฝ”๋”ฉํ•  ๋•Œ bluebird-2.0.d.ts๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

@JoshMcCullough

์ œ3์ž ์ฝ”๋“œ๊ฐ€ ์ „์—ญ ์ˆ˜์ค€์—์„œ Bliebird ๊ตฌํ˜„์œผ๋กœ ๋Œ€์ฒด๋œ Promise ์ƒ์„ฑ์ž(new Promise(...))๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

๊ฝค ์‰ฝ์Šต๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €์˜ ์ฝ˜์†”์—์„œ ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค(Chrome ์„ ํ˜ธ):

var NativePromise = Promise;
window.Promise = function() {}; // try to overload NativePromise
NativePromise === Promise; // false. Seems it is overloaded!
// And now, let check with some native code, which return Promise, for example fetch
Object.getPrototypeOf(fetch("")) === Promise.prototype; // false, Whoops!
Object.getPrototypeOf(fetch("")) === NativePromise.prototype; // true! Double whoops!

์•ˆ๋…•. ๋‚˜๋Š” ์ด๊ฒƒ์„ ํ•˜๊ณ  ์žˆ๊ณ  ๊ฝค ๋ถ€๋“œ๋Ÿฝ๋‹ค. ์šฐ์„  ๋„์„œ๊ด€ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ธ”๋ฃจ๋ฒ„๋“œ์— ์˜์กดํ•˜์ง€ ๋งˆ์„ธ์š”. ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ ํƒ€์ดํ•‘์ด ์•„๋‹Œ bluebird๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ง„์ž…์ ์—์„œ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค.

global['์•ฝ์†'] = require('๋ธ”๋ฃจ๋ฒ„๋“œ')

์ด๊ฒƒ์€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ๊ณผ ํฌํ•จ๋œ ๋ชจ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ์ „์—ญ ์•ฝ์† ๊ฐœ์ฒด๋ฅผ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„,

@types/bluebird-global ์„(๋ฅผ) ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํƒ€์ดํ•‘์€ ๋ณด๋‹› ์•„๋ž˜์— @types/bluebird@^3.0 ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ธ€๋กœ๋ฒŒ Promise ์—์„œ ๋ธ”๋ฃจ๋ฒ„๋“œ์˜ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค(์ฆ‰, ts ์ปดํŒŒ์ผ์ด ์‹คํŒจํ•˜์ง€ ์•Š์Œ).

์‚ฌ์šฉ ๋ฐฉ๋ฒ•์„ ๋ณด๋ ค๋ฉด ์ด๊ฒƒ์„ ์ฝ์œผ์‹ญ์‹œ์˜ค.

๊ต‰์žฅํ•ฉ๋‹ˆ๋‹ค, ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค @d-ph!

@d-ph @types/bluebird-global ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. Bluebird๋ฅผ ๊ธ€๋กœ๋ฒŒ Promise์˜ ๋Œ€์ฒดํ’ˆ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํ”„๋กœ์ ํŠธ์—์„œ ์–ด๋–ค ์ข…๋ฅ˜์˜ ๊ฐ€์ ธ์˜ค๊ธฐ ๋ฐ ์žฌํ• ๋‹น์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

npm install --save-dev @types/bluebird-global ๋ฅผ ์ž…๋ ฅํ•œ ๋‹ค์Œ ์ž…๋ ฅ: ๋งํฌ (2017-04-02 ์—…๋ฐ์ดํŠธ๋œ ๋งํฌ)์— ํฌํ•จ๋œ ์ง€์นจ์„ ๋”ฐ๋ฅด์„ธ์š”. ์ด๊ฒƒ๋งŒ์œผ๋กœ๋„ ํŠธ๋ฆญ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์ฆ‰, ์ˆ˜๋™ ๊ฐ€์ ธ์˜ค๊ธฐ/์žฌํ• ๋‹น์ด ํ•„์š”ํ•˜์ง€ ์•Š์•„์•ผ ํ•จ).

์ฐธ๊ณ ๋กœ $#$2 @types/bluebird ์—์„œ package.json::devDependencies ๋ฅผ ๋” ์ด์ƒ ์–ธ๊ธ‰ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ž๋™์œผ๋กœ ์•”์‹œ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด์ „ ๋Œ“๊ธ€์˜ ๋งํฌ๋กœ ์—…๋ฐ์ดํŠธ: ๋งํฌ

@MichaelTontchev @d-ph bluebird-global ์— Promise.Inspection ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์•ˆ๋…•ํ•˜์„ธ์š” @ksnyde์ž…๋‹ˆ๋‹ค.

์ €์™€ ์ด์•ผ๊ธฐํ•ด ์ฃผ์„ธ์š”. ๋‚˜๋Š” ์œ ์ง€ ๋ณด์ˆ˜์ž…๋‹ˆ๋‹ค.

์ด ์•ฝ์†์„ ๋ง์”€ํ•˜์‹œ๋Š”์ง€ ํ™•์ธํ•ด ์ฃผ์‹œ๊ฒ ์–ด์š”.๊ฒ€์‚ฌ ์ข€ ํ•ด์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ชจ๋“  ๋ฉ”์†Œ๋“œ๋Š” bluebird-global ๋ฅผ ํ†ตํ•ด ๋…ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰ ๋‹ค์Œ์ด ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค.

let promiseInspectionTest = new Promise<void>((resolve) => {});
promiseInspectionTest.value();

๊ทธ๋ž˜์„œ bluebird-global Promise.Inspection ๋กœ ๋…ธ์ถœ๋˜๋„๋ก ์š”์ฒญ ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์„ ๋Œ€์‹  ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํฐ ๋ฌธ์ œ์ธ์ง€ ์•Œ๋ ค์ฃผ์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

import * as Bluebird from "bluebird";

class Foo<T> implements Bluebird.Inspection<T> {

}

bluebird-global ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ช…์‹œ์ ์ธ devDependencies ์—†์ด ์›๋ž˜ bluebird ํƒ€์ดํ•‘์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” $# lib.d.ts ์˜ ํ‘œ์ค€ Promise ํƒ€์ดํ•‘๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ๋ฏธ๋ฌ˜ํ•œ ๊ธฐ์ˆ ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ™•์‹คํ•œ ์ด์œ  ์—†์ด ์ „์—ญ Promise ์„ ๋” ์ด์ƒ ํ™•์žฅํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. bluebird ํƒ€์ดํ•‘์—์„œ ์ง์ ‘ ์ด ์ธํ„ฐํŽ˜์ด์Šค์— ์•ก์„ธ์Šคํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์–ธ์  ๊ฐ€ JavaScript ์ „๋ฌธ๊ฐ€๊ฐ€ Promise.Inspection ๋ฅผ ํ‘œ์ค€์— ์ถ”๊ฐ€ํ•˜์—ฌ bluebird-global ํƒ€์ดํ•‘์„ ๊นจ๋œจ๋ฆด ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ตœ์ข… ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ถˆํ•„์š”ํ•œ ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๋”๋ผ๋„ master ์— ๋ณ‘ํ•ฉ๋˜๊ธฐ๊นŒ์ง€ ์ง€์ •๋˜์ง€ ์•Š์€ ์‹œ๊ฐ„์„ ๊ธฐ๋‹ค๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์š”์ฆ˜ DT์˜ ๋ฉ”์ธํ…Œ์ด๋„ˆ๋“ค์ด PR๋กœ ๋ฐ”์˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ฑด๋ฐฐ.

๋‚˜๋Š” ์‹ค์ œ๋กœ ๊ท€ํ•˜๊ฐ€ ๋…ผ์˜ํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ๋‹น๋ถ„๊ฐ„ ์‚ฌ์šฉํ•ด ์™”์œผ๋ฉฐ ์ ์ ˆํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๋˜๋Š” "ํ•ด๊ฒฐ์ฑ…"์ด ์ž˜๋ชป๋œ ๋ช…๋ช…๋ฒ•์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ์ดํ•ด/์ธ์‹์€ bluebird-global ๋’ค์— ์žˆ๋Š” ์•„์ด๋””์–ด๋Š” bluebird๊ฐ€ ์ œ๊ณตํ•˜๋Š” Promise ๊ธฐ๋Šฅ์˜ ์ƒ์œ„ ์ง‘ํ•ฉ์„ ๋…ธ์ถœํ•˜๋Š” ๊ฒƒ์ด์—ˆ์œผ๋ฉฐ ์ด ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž๋กœ์„œ Bluebird.Inspection ๊ฐ€ Promise.Inspection ์— ๋…ธ์ถœ๋  ๊ฒƒ์œผ๋กœ _๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์˜๋„๊ฐ€ Promises์˜ ๊ณต์‹ API ํ‘œ๋ฉด์ด Bluebird๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด๋ผ๋ฉด ์ด "ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•"์ด ์‹ค์ œ๋กœ ์ ์ ˆํ•œ ์žฅ๊ธฐ ์†”๋ฃจ์…˜์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ํ•ด์„์„ ์„ ํ˜ธํ•˜์ง€๋งŒ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์—ฌ๊ธฐ์— ์ œ๊ณต๋œ ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์ด ๋‹น์‹ ์˜ ๊ธฐ๋Œ€์™€ ํ•จ๊ป˜ ์–ด๋””์—์„œ ์™”๋Š”์ง€ ํ™•์‹คํžˆ ์•Œ์ง€๋งŒ, ๋‚ด๊ฐ€ bluebird-global ๋ฅผ ๋งŒ๋“  ์ฃผ๋œ ์ด์œ ๋Š” TypeScript์— ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•จ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ํƒ€์‚ฌ ์ฝ”๋“œ์—์„œ ์ƒ์„ฑ๋˜๊ณ  ๋ฐ˜ํ™˜๋œ Promise๋Š” ์‹ค์ œ๋กœ Bluebird Promise์˜ ์ธ์Šคํ„ด์Šค์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ _์„ฑ๊ฐ€์‹œ์ง€ ์•Š์€_ ๋Œ€์•ˆ์€ ์—†์—ˆ์ง€๋งŒ Bluebird์˜ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค์™€ ์ •์  ๋ฉ”์„œ๋“œ๋ฅผ ์ „์—ญ Promise ๊ธฐํ˜ธ์— ๋…ธ์ถœํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ „์— ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์ˆ˜ํ–‰ ๋ฐฉ์‹์€ ๋‹จ์ˆœํ•œ class Promise<T> extends Bluebird<T> {} ๊ฐ€ ์•„๋‹ˆ๋ผ(์›๋ž˜๋Š” ์žˆ์—ˆ์ง€๋งŒ) ์‹ ์ค‘ํ•˜๊ฒŒ ํŒจ์น˜๋œ ์ „์—ญ Promise ๊ธฐํ˜ธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚ด๊ฐ€ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด, ๋‚˜๋Š” ๋ฌธ์ž ๊ทธ๋Œ€๋กœ ๋‹น์‹ ์ด ๋จธ๋ฆฌ๋ฅผ ๋ฝ‘๊ฒŒ ๋งŒ๋“ค์ง€ ์•Š๋Š” ์•Œ๋ ค์ง„ ๋Œ€์•ˆ์ด ์žˆ๋Š” ๊ฒƒ์„ ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์— ๋Œ€ํ•ด "์•„๋‹ˆ์˜ค"๋ผ๊ณ  ๋งํ•ด์„œ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ด ํŠน์ • ๊ธฐ๋Šฅ์„ ์š”์ฒญํ•˜๋Š” ์‚ฌ๋žŒ์ด ๋” ๋งŽ๋‹ค๋ฉด ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ์žฌ๊ณ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ๊ถŒ์œ„์ ์œผ๋กœ ๋“ค๋ฆฌ๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ์ด๋ฉฐ ๋ˆ„๊ตฌ๋‚˜ ์ด ๊ธฐ๋Šฅ์„ ๋„์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ œ๊ฐ€ ๋งํ•˜๊ณ ์ž ํ•˜๋Š” ์š”์ ์€ ์ œ ์ƒ๊ฐ์—๋Š” ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ด์ ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์œ ์ง€ ๋น„์šฉ์„ ์ดˆ๊ณผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฑด๋ฐฐ.

๋ง์ด๋œ๋‹ค. ์ ‘๊ทผ ๋ฐฉ์‹์— ๋Œ€ํ•œ ์ƒ๊ฐ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

@d-ph๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ... "reflect"๊ฐ€ ์•„๋ž˜ ์ฝ”๋“œ์˜ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

image

ํŽธ์ง‘๊ธฐ์˜ ์ธํ…”๋ฆฌ์„ผ์Šค์—์„œ๋Š” ๋งคํ•‘ ํ•จ์ˆ˜์˜ p ์†์„ฑ์ด Bluebird Promise์ด๊ณ  Bluebird์—์„œ๋งŒ ๋ณผ ์ˆ˜ ์žˆ๋Š” ํ™•์žฅ API ํ‘œ๋ฉด(Promise ๋Œ€๋น„)์ด ์žˆ์Œ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‹๋ณ„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

image

๋‚˜๋Š” ๊ทธ๊ฒƒ์—์„œ ๋จธ๋ฆฌ๋‚˜ ๊ผฌ๋ฆฌ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ง€๋„์˜ ๋ฐ˜๋ณต์ž ๋ณ€์ˆ˜์˜ _type_์„ ๊ฒ€์‚ฌํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

image

์ด๊ฒƒ์ด ๊ถ๊ทน์ ์œผ๋กœ bluebird-global ๋กœ ์ •์˜๋œ ์ œํ•œ๋œ API ํ‘œ๋ฉด์„ ์–ป๋Š” ์ด์œ ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ•ด๊ฒฐ๋˜์ง€ ์•Š๋Š” ์ด์œ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•.

์žฌํ˜„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค./ ํ•ด๋‹น ์ฝ”๋“œ ์กฐ๊ฐ์€ ๋‚ด ์„ค์ •์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€์žฅ ๋จผ์ €. allSettled() ํ•จ์ˆ˜์—์„œ bluebird-global ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Bluebird ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง์ ‘ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ์ง€๋งŒ ์•„๋งˆ๋„ ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ์ธ์‹ํ•˜์ง€ ๋ชปํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ์Šค๋‹ˆํŽซ์€ bluebird-global ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

function allSettled<T>(promises: Array<Promise<T>>) {
    const reflections = Promise.all<T>(promises.map((promise => {
        return promise.reflect();
    })));

    return reflections;
}

์ฆ‰, ํ•ด๋‹น ์Šค๋‹ˆํŽซ์€ ์ „์—ญ Promise ( bluebird-global.d.ts ์˜ Bluebird ๋ฉ”์„œ๋“œ๋กœ ํŒจ์น˜๋จ)์— ์œ ํ˜•์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋งํ–ˆ๋“ฏ์ด: ์ด๊ฒƒ์€ ๊ท€ํ•˜์˜ ์ •๋ณด๋ฅผ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ท€ํ•˜์™€ ์ œ ์Šค๋‹ˆํŽซ์ด ๋ชจ๋‘ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ท€ํ•˜๊ฐ€ ์•Œ์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ์— ๋Œ€๋น„ํ•ฉ๋‹ˆ๋‹ค.

Bluebird์˜ ๋ฐฉ๋ฒ•์ด ๋ˆ„๋ฝ๋œ ๋ฌธ์ œ๋กœ ๋Œ์•„๊ฐ€์‹ญ์‹œ์˜ค. ๋‚ด ์ƒ๊ฐ์—: ๋Ÿฐํƒ€์ž„์— ์ „์—ญ Promise ์„ Bluebird๋กœ ๋ฐ”๊พธ์ง€ ์•Š๊ณ  Bluebird ๋Œ€์‹  ์ „์—ญ Promise๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑ๋œ Promises๋กœ allSettled() ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ œ ์ฝ”๋“œ์™€ ์Šคํฌ๋ฆฐ์ƒท์„ ๋ณด์—ฌ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

function allSettled<T>(promises: Array<Promise<T>>) {
    const reflections = Promise.all<T>(promises.map((promise => {
        return promise.reflect();
    })));

    return reflections;
}

let promises = [
    Promise.resolve(),
    Promise.reject(new Error("rejected test")),
    new Promise<void>(() => {}),
];

let reflections = allSettled(promises);

console.log(reflections);
// this is part of my entry point

/*
 * Promise
 */
import * as Promise from 'bluebird';
import 'expose-loader?Promise!bluebird';

image
_๊ทธ๋ฆผ 1: Array.map()์˜ ์•ฝ์†์€ Bluebird์ž…๋‹ˆ๋‹ค( _bitField ์™€ ๊ฐ™์€ ๋ฐ‘์ค„ ์†์„ฑ์˜ ์กด์žฌ๋กœ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค)_

image
_๊ทธ๋ฆผ 2: Promise.reflect๋Š” ์‹ค์ œ๋กœ ๋ฃจํ”„์— ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค_

Chrome Dev Tools์—์„œ ์ €์™€ ๊ฐ™์€ js ์ค‘๋‹จ์ ์„ ์„ค์ •ํ•˜๊ณ  .map promise ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•: ์ฝ˜์†”์— Promise ๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ๋‹ค์Œ ์ถœ๋ ฅ์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
image

๋‹ค์Œ ์ถœ๋ ฅ์ด ํ‘œ์‹œ๋˜๋ฉด ๋Ÿฐํƒ€์ž„์— ์ „์—ญ Promise๋ฅผ Bluebird๋กœ ๋ฐ”๊พธ์ง€ ์•Š์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
image

์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ํ•ญ๋ชฉ ํŒŒ์ผ์— ๋‚˜์™€ ๊ฐ™์€ ์˜ˆ.

๋งˆ์ง€๋ง‰์œผ๋กœ ์•ฝ๊ฐ„์˜ ๊ฐœ๋ฐœ์ž ํ”ผ๋“œ๋ฐฑ: ๊ฐœ์ธ์ ์œผ๋กœ Array<Promise<T>> Promise<T>[] ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ๋ฌผ๋ก  ๊ฐœ๋ฐœ์ž์˜ ์ทจํ–ฅ์— ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ํ…œํ”Œ๋ฆฟ์ด ์—†๊ณ  ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฐฐ์—ด ์•ก์„ธ์Šค ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ ํ˜•์„ ์ •์˜ํ•˜๋Š” C ๋ฐฐ๊ฒฝ์—์„œ ์™”์Šต๋‹ˆ๋‹ค.

๊ฑด๋ฐฐ.

์ด๋ ‡๊ฒŒ ์ž์„ธํ•œ ์„ค๋ช… ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ํ™•์‹ ํ•˜์ง€ ๋ชปํ•œ ํ•œ ๊ฐ€์ง€๋Š” ๋‹ค์Œ์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ๋‚ด์šฉ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

import '๋…ธ์ถœ ๋กœ๋”?์•ฝ์†!๋ธ”๋ฃจ๋ฒ„๋“œ';

@d-ph ahhh, ์œ„์˜ ํ•˜๋‚˜์˜ ๋ผ์ด๋„ˆ๊ฐ€ ๋‚ด๊ฐ€ ๋ˆ„๋ฝ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์˜ ๋„์›€์ด ์—†์—ˆ๋‹ค๋ฉด ๊ฒฐ์ฝ” ๊ฑฐ๊ธฐ์— ๋„๋‹ฌํ•˜์ง€ ๋ชปํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค! ์ €๋งŒ ๊ทธ๋Ÿด ์ˆ˜๋„ ์žˆ์ง€๋งŒ README ํ…์ŠคํŠธ์— Expose Loader ์‚ฌ์šฉ์— ๋Œ€ํ•œ ์ฐธ์กฐ๊ฐ€ ์žˆ์œผ๋ฉด ๋„์›€์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ณต์ •ํ•˜๊ธฐ๋Š” ํ•˜์ง€๋งŒ ์›นํŒฉ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์—ฌ์ „ํžˆ 100%๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋‚ด ๋ชฉํ‘œ๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์•„๋‹ˆ๋ผ ๋…ธ๋“œ ๊ธฐ๋Šฅ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ์™„์ „ํžˆ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค(๋Ÿฐํƒ€์ž„ ์ „์— ํŽธ์ง‘๊ธฐ์— ์˜ค๋ฅ˜ ์—†์Œ).

์˜ค๋ฅ˜: 'expose-loader?Promise!bluebird' ๋ชจ๋“ˆ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋งž์•„์š”. expose-loader ๋Š” ์›นํŒฉ(์›นํŒฉ ๋กœ๋”)์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ webpack์ด ํ•ด๋‹น import ๋ฌธ์„ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•˜์ง€ ์•Š์œผ๋ฉด ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์ฆ‰, "Cannot find module" ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋จ).

webpack์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋Ÿฐํƒ€์ž„์— ์ „์—ญ Promise๋ฅผ Bluebird๋กœ ๋งŒ๋“œ๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์ฐพ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ์— ๋Œ€ํ•œ ๊ฒฝํ—˜์ด ๋งŽ์ง€ ์•Š์ง€๋งŒ ์ง€๊ธˆ ๋ฐ”๋กœ https://github.com/petkaantonov/bluebird/issues/1026(๋…ธ๋“œ์—์„œ Promise ์žฌ์ •์˜)์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

์ตœ์‹  ๋…ธ๋“œ 7์—์„œ async/await๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ๋Œ€์— ์‚ด๊ณ  ์žˆ๋Š” ๊ฒƒ์€ ํ–‰์šด์ž…๋‹ˆ๋‹ค.

README์—์„œ expose-loader ์‚ฌ์šฉ์— ๋Œ€ํ•ด ์–ธ๊ธ‰ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จํ•˜์—ฌ: d.ts ํŒŒ์ผ์˜ ๋งจ ์œ„์— ์ด๋ฏธ ๋ช…์‹œ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋Ÿฐํƒ€์ž„์— Promise๋ฅผ Bluebird๋กœ ๋ฐ”๊พธ๋Š” ๊ฐœ๋ฐœ์ž์˜ ์ž‘์—…์ž…๋‹ˆ๋‹ค: link . ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋„ˆ๋ฌด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ ๊ทธ ์ค‘ ์•„๋ฌด ๊ฒƒ๋„ ์–ธ๊ธ‰ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. expose-loader ๋Š” window.Promise = Bluebird ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ธ€์Ž„, ๊ตฌ๊ธ€์ด ๋‚ด ๋‹ต์žฅ์„ ์ƒ‰์ธ์œผ๋กœ ๋งŒ๋“ค์–ด ์‚ฌ๋žŒ๋“ค์ด ๋” ์ด์ƒ ๊ฐ€๋Šฅํ•œ ์˜ต์…˜์„ ๋„ˆ๋ฌด ์˜ค๋žซ๋™์•ˆ ์ฐพ์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ž€๋‹ค.

@d-ph๋Š” ๊ธฐ๋ณธ async-await๋ฅผ ๊ธฐ๋Œ€ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ๋ชจ๋“  ๊ธฐ๋Šฅ์€ AWS Lambda์— ์žˆ์œผ๋ฏ€๋กœ ์ง€๊ธˆ์€ ๋…ธ๋“œ 6.10.x์— ๊ณ ์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์˜ ํ–ฅํ›„ ๋‹จ๊ณ„์—์„œ๋Š” ์–ด์จŒ๋“  async-await๋กœ ์ „ํ™˜ํ•˜๊ณ  Typescript๊ฐ€ ์ด๋ฅผ ES2015๋กœ ๋ณ€ํ™˜ํ•˜๋„๋ก ํ•  ๊ฒƒ์ด์ง€๋งŒ ์•„์ง ์ด๊ฒƒ์„ ๋„์ž…ํ•˜๊ณ  ์‹ถ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

์–ด์จŒ๋“  @d-ph ๋งํฌ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‹œ๋„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„ ๊ทธ๋ฆฌ๊ณ  ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด ํ•จ์ˆ˜์˜ ์ตœ์ข… ๋ฒ„์ „์— ๊ด€์‹ฌ์ด ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ(์•ฝ์† ์˜์—ญ์—์„œ ๋งค์šฐ ํŽธ๋ฆฌํ•จ):

export function allSettled<T>(promises: Array<Promise<T>>) {
  const reflections = Promise.all<Promise.Inspection<T>>( promises.map((p => p.reflect())) );
  return reflections as Promise<Array<Promise.Inspection<T>>>;
}

export function settleProps<T>(promiseHash: IDictionary<Promise<T>>) {

  const reflections: IDictionary<Promise<Promise.Inspection<T>>> = Object.keys(promiseHash)
    .reduce((newObject: IDictionary<any>, key: string) => {
      newObject[key] = promiseHash[key].reflect();
      return newObject;
    }, {} as IDictionary<Promise<Promise.Inspection<T>>>);

  return Promise.props(reflections) as Promise<IDictionary<Promise.Inspection<T>>>;
}

์ „์ฒด intelisync/์œ ํ˜• ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด ๋งค์šฐ ์ข‹์Šต๋‹ˆ๋‹ค.

@d-ph ๋ฐ”๋ผ๊ฑด๋Œ€ ๊ด€๋ จ ์งˆ๋ฌธ์œผ๋กœ ์ด๊ฒƒ์„ ๋˜์‚ด๋ฆฌ๋ฉด ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค ...

bluebird-global์„ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋ฉด then ๋ฐ catch ๋ชจ๋‘์—์„œ ์ •์˜ ์ฐจ์ด๊ฐ€ ์กฐ๊ธˆ์”ฉ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ๋“ค์ด bluebird-global์—์„œ ํŠน๋ณ„ํžˆ ์ฒ˜๋ฆฌ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์ง€๋งŒ, bluebird๋ฅผ ์–ป๋Š” ๋Œ€์‹  ํ‘œ์ค€ Promise API๋กœ ๋‚˜๋ฅผ ์ œํ•œํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

Promise.resolve(true).catch(Error, () => false)

catch ๋Š” 1๊ฐœ์˜ ์ธ์ˆ˜๋งŒ ์˜ˆ์ƒํ•˜๋ฏ€๋กœ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ:

Promise.resolve([3]).map((n: number) => true)

์‹คํŒจ:

โ”‚TS2345: Argument of type '(n: number) => boolean' is not assignable to parameter of type 'IterateFunction<{}, boolean>'.           โ”‚
โ”‚  Types of parameters 'n' and 'item' are incompatible.                                                                             โ”‚
โ”‚    Type '{}' is not assignable to type 'number'.                                                                                  โ”‚

๊ทธ๊ฒƒ๋“ค์ด ์ž‘๋™ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด ๋‚ด๊ฐ€ ๋ญ”๊ฐ€๋ฅผ ์ž˜๋ชปํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋“ค์€ ๋Ÿฐํƒ€์ž„์— ์ž‘๋™ํ•˜๋ฉฐ ์œ ํ˜• ๊ฒ€์‚ฌ๋ฅผ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌ ํ•ด์š”!

์•ˆ๋…•,

.catch(Error, function) ์— ๋Œ€ํ•ด .then , .catch (๋ฐ ๊ทธ ์ด์ƒ)์€ ๋‚˜๋จธ์ง€ Bluebird ๊ธฐ๋Šฅ๊ณผ ๋‹ค๋ฅด๊ฒŒ ์ฒ˜๋ฆฌ๋œ๋‹ค๋Š” ๋ง์ด ์˜ณ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํŠน์ • .catch(Error, function) ์žฌ์ •์˜ ๋Š” bluebird-global ์— ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‘ ๋ฒˆ ํ™•์ธํ•˜๊ณ  ์ปดํŒŒ์ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Promise.resolve(true).catch(Error, () => false)

TS 3.0.1 ๋ฐ 2.9.2๋กœ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ์™œ ์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. bluebird-global ์ดํ›„์˜ ์ „์—ญ Promise๋ฅผ ์žฌ์ •์˜ํ•˜๋Š” TS ํ”„๋กœ์ ํŠธ์— ํŠน์ •ํ•œ ๊ฒƒ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋ฅด๊ฒ ์–ด์š”. ์•„์ฃผ ๊ธฐ๋ณธ์ ์ธ TS ํ”„๋กœ์ ํŠธ์—์„œ ์‹œ์ž‘ํ•œ ๋‹ค์Œ ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์—์„œ ๋” ๋งŽ์€ ์ข…์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๋Š” ์›์ธ์„ ์ขํžˆ๊ณ  ์–ด๋Š ์ง€์ ์—์„œ ์ค‘๋‹จ๋˜๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

๋‹ค๋ฅธ ๋ฌธ์ œ์— ๋Œ€ํ•ด: ์™œ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์˜ˆ, ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ github ๋ฌธ์ œ๋ฅผ ์ƒ์„ฑํ•˜์‹ญ์‹œ์˜ค. ๊ฑฐ๊ธฐ์„œ๋ถ€ํ„ฐ ์ง„ํ–‰ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค.

  1. bluebird-global ๊ฐ€ .map() ์™€ ํ•จ๊ป˜ ํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์€ bluebird.d.ts ์˜ .map() ์œ ํ˜• ์ •์˜๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, bluebird-global ํƒ€์ดํ•‘์—์„œ ๊ฒฐํ•จ์ด ๋ฐœ์ƒํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.
  2. ์–ธ๊ธ‰ํ•œ ์ค„์€ Promise.map() ์—์„œ ์‹คํŒจํ•˜์ง€๋งŒ Bluebird.map() ์—์„œ๋Š” ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
import Bluebird = require('bluebird');

Bluebird.resolve([3]).map((n: number) => true); // works

Promise.resolve([3]).map((n: number) => true); // fails
  1. typescript์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๋…ํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์„ ๋ณด๋‚ธ ํ›„(๋ณธ์งˆ์ ์œผ๋กœ: TS๊ฐ€ n {} ํ•œ๋‹ค๊ณ  ๊ฒฐ๋ก ์ง“๋Š” ์ด์œ ), ์ €๋Š” bluebird.d.ts ๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค๊ณ  ๊ฒฐ๋ก ์ง€์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ์•Œ๋ ค์ง€์ง€ ์•Š์€ ์ด์œ ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ ๋‹ค์Œ์€ ๋ชจ๋“  ์ถ”์ƒํ™” ๊ณ„์ธต์„ ์ œ๊ฑฐํ•œ ํ›„ .map() ์— ์ž…๋ ฅ๋˜๋Š” ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.
map<U>(
    mapper: (
        item: U,
        index: number,
        arrayLength: number
    ) => U | PromiseLike<U>,
    options?: Bluebird.ConcurrencyOption
): Bluebird<T extends Iterable<any> ? U[] : never>;

mapper item ์˜ ์œ ํ˜•๊ณผ ๋™์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๋˜๋Š” ๋™์ผํ•œ ์•ฝ์†). ๊ท€ํ•˜์˜ ์˜ˆ์—์„œ ํ•ญ๋ชฉ ์œ ํ˜•์€ number ์ด๊ณ  ๋ฐ˜ํ™˜ ์œ ํ˜•์€ boolean ์ž…๋‹ˆ๋‹ค. Bluebird ๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•  ๋•Œ ์ด๊ฒƒ์ด ์ปดํŒŒ์ผ๋˜๋Š” ์ด์œ ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์—†์ง€๋งŒ ์ „์—ญ Promise๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ , ๊ท€ํ•˜์˜ ์˜ˆ์ œ์—์„œ ๋ฐ˜ํ™˜ ์œ ํ˜•์„ ์ˆซ์ž๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ์—ฌ์ „ํžˆ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ item ์œ ํ˜•์ด any ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋งํ•˜๋ฉด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. bluebird.d.ts ์˜ type IterableItem<R> ๋ฐ ์ด ์ปจํ…์ŠคํŠธ์—์„œ์˜ ์‚ฌ์šฉ๋ฒ•์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

@d-ph


ํŽธ์ง‘ํ•˜๋‹ค:

map() ์˜ "unlayered" ํ˜•์‹์„ ๋‹ค์‹œ ํ™•์ธํ–ˆ๋Š”๋ฐ mapper ํ•จ์ˆ˜๊ฐ€ item ์œ ํ˜•๊ณผ ๋™์ผํ•œ ๋ฐ˜ํ™˜ ์œ ํ˜•์„ ๊ฐ€์ง€๋„๋ก ์ž…๋ ฅ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์˜€๋‹ค). ๋‚ด ์ž˜๋ชป์ด์•ผ.

.map()์œผ๋กœ ๋ชจ๋“  bluebird-global์€ bluebird.d.ts์˜ .map() ์œ ํ˜• ์ •์˜๋ฅผ ์žฌ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ œ๋„ค๋ฆญ ํด๋ž˜์Šค Bluebird<R> ์—์„œ ์œ ํ˜•์„ ๋ณต์‚ฌํ•  ๋•Œ ๋ถ€๋ชจ๋กœ๋ถ€ํ„ฐ ์œ ์ถ”ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— R $์— ๋Œ€ํ•ด ๊ธฐ๋ณธ์ ์œผ๋กœ {} ๊ฐ€ ๋˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๊นŒ?

map: typeof Bluebird<T>.prototype.map ๊ฐ€ ์ž‘๋™ํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. (๋‚˜๋Š” ์ด๊ฒƒ์„ ์•„์ง ์‹œ๋„ํ•˜์ง€ ์•Š์•˜๋‹ค)

์ค‘์š”ํ•œ:
@types/bluebird-global ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ @d-ph๊ฐ€ ๋งํ•œ ๋Œ€๋กœ ์ข…์†์„ฑ @types/bluebird $์—์„œ ์‚ญ์ œํ•˜์‹ญ์‹œ์˜ค.

npm install --save-dev @types/bluebird-global ๋ฅผ ์ž…๋ ฅํ•œ ๋‹ค์Œ ์ž…๋ ฅ: ๋งํฌ (2017-04-02 ์—…๋ฐ์ดํŠธ ๋งํฌ)์— ํฌํ•จ๋œ ์ง€์นจ์„ ๋”ฐ๋ฅด์„ธ์š”. ์ด๊ฒƒ๋งŒ์œผ๋กœ๋„ ํŠธ๋ฆญ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์ฆ‰, ์ˆ˜๋™ ๊ฐ€์ ธ์˜ค๊ธฐ/์žฌํ• ๋‹น์ด ํ•„์š”ํ•˜์ง€ ์•Š์•„์•ผ ํ•จ).

์ฐธ๊ณ ๋กœ package.json::devDependencies @types/bluebird #$๋ฅผ ๋” ์ด์ƒ ์–ธ๊ธ‰ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ž๋™์œผ๋กœ ์•”์‹œ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋‘˜ ๋‹ค ์žˆ์œผ๋ฉด @types/bluebird ์™€ ๋‚ด ์ „์—ญ ์•ฝ์†( @types/bluebird-global )์— ์˜ํ•ด ๋ฐ˜ํ™˜๋˜๋Š” ์œ ํ˜• ๊ฐ„์— ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰