์๋ ๋ชจ๋๋ค!
์ ๋ ์ ์ญ Promise ๊ฐ์ฒด๋ฅผ ๋์ฒดํ๊ธฐ ์ํด bluebird๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. typedef๋ฅผ @lhecker ์ ์ํด ๊ฒ์๋ ์ต์ ๋ฒ์ ์ผ๋ก ์
๋ฐ์ดํธํ๋ ค๊ณ ์๋ํ์ง๋ง ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. global Promsie
๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ด์ ์ค๋ฒ๋ก๋๋์ง ์์ต๋๋ค.
์ด์ ํ๋์ ์ด๋ป๊ฒ ๋ฌ์ฑํฉ๋๊น? ์๋ฅผ ๋ค์ด bluebird-global.d.ts๊ฐ ์์ ์ ์์ต๋๊น?
๊ธ์์ 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 ํ๋ก์ ํธ๊ฐ ์ปดํ์ผ๋๋ ๋ฐฉ์์ผ๋ก ๋ธ๋ฃจ๋ฒ๋ ํ์ดํ์ ์ฌ์ฉํ๋ ์ด์ ๊ฐ ๋ฌด์์ธ์ง ์๋ ค์ฃผ์ค ์ ์์ต๋๊น?
ํ์ฌ ํด๊ฒฐ ๋ฐฉ๋ฒ:
Promise
ํจ์์ ๊ฒฝ์ฐ Promise["config"]({}); Promise.resolve("foo")["finally"](() => { console.log("lol"); })
๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํ์ผ๋ฌ๋ฅผ ์นจ๋ฌต์ํต๋๋ค. ์ฆ, ๋ฐฐ์ด ์ก์ธ์ค ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํฉ๋๋ค. [""]
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์ ๋ฐ๋)์์ ์ค๋ ๋ชจ๋ ์ฌ๋๋ค์ด ๋ค์๊ณผ ๊ฐ์ ํ์ ๋ฌธ์ ๋ฅผ ์ผ์ผํค๊ธฐ ๋๋ฌธ์ ๋๋ค.
npm install <absolutely everything that uses es6 promise>
npm install bluebird @types/bluebird
๋ํ ๋์ค์ ์ฐธ์กฐํ ์ ์๋๋ก ์ด "์ 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
์ข
๋ฅ์ ์๋ฃจ์
์ด ์์ต๋๋ค. ์๋๋ฉด ์ ์ด๋ ๋๋ ๊ทธ๊ฒ์ ์์ง ๋ชปํฉ๋๋ค.
๋ด๊ฐ ๋ง์ง๋ง์ผ๋ก ๋น์ ์ ํ์ธํ์ ๋:
import * as Bluebird from 'bluebird'; declare global { export interface Promise<T> extends Bluebird<T> {} }
ํ์ ๋ชจ๋ ์ง์
์ *.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"๊ฐ ์๋ ์ฝ๋์ ํจ์๊ฐ ์๋๋ผ๋ ์ค๋ฅ๊ฐ ํ์๋ฉ๋๋ค.
ํธ์ง๊ธฐ์ ์ธํ
๋ฆฌ์ผ์ค์์๋ ๋งคํ ํจ์์ p
์์ฑ์ด Bluebird Promise์ด๊ณ Bluebird์์๋ง ๋ณผ ์ ์๋ ํ์ฅ API ํ๋ฉด(Promise ๋๋น)์ด ์์์ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ณํ๊ณ ์์ต๋๋ค.
๋๋ ๊ทธ๊ฒ์์ ๋จธ๋ฆฌ๋ ๊ผฌ๋ฆฌ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์ง๋์ ๋ฐ๋ณต์ ๋ณ์์ _type_์ ๊ฒ์ฌํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ์๋ฉ๋๋ค.
์ด๊ฒ์ด ๊ถ๊ทน์ ์ผ๋ก 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';
_๊ทธ๋ฆผ 1: Array.map()์ ์ฝ์์ Bluebird์
๋๋ค( _bitField
์ ๊ฐ์ ๋ฐ์ค ์์ฑ์ ์กด์ฌ๋ก ์ ์ ์์ต๋๋ค)_
_๊ทธ๋ฆผ 2: Promise.reflect๋ ์ค์ ๋ก ๋ฃจํ์ ์ ์๋์ด ์์ต๋๋ค_
Chrome Dev Tools์์ ์ ์ ๊ฐ์ js ์ค๋จ์ ์ ์ค์ ํ๊ณ .map
promise
๊ฐ ๋ฌด์์ธ์ง ํ์ธํ ์ ์์ต๋๊น? ๋ ๋์ ๋ฐฉ๋ฒ: ์ฝ์์ Promise
๋ฅผ ์
๋ ฅํ๊ณ ๋ค์ ์ถ๋ ฅ์ ์ป์ ์ ์๋์ง ํ์ธํ ์ ์์ต๋๋ค.
๋ค์ ์ถ๋ ฅ์ด ํ์๋๋ฉด ๋ฐํ์์ ์ ์ญ Promise๋ฅผ Bluebird๋ก ๋ฐ๊พธ์ง ์์ ๊ฒ์
๋๋ค.
์ด๋ค ๊ฒฝ์ฐ์๋ ํด์ผ ํฉ๋๋ค. ๊ทํ์ ํญ๋ชฉ ํ์ผ์ ๋์ ๊ฐ์ ์.
๋ง์ง๋ง์ผ๋ก ์ฝ๊ฐ์ ๊ฐ๋ฐ์ ํผ๋๋ฐฑ: ๊ฐ์ธ์ ์ผ๋ก 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 ๋ฌธ์ ๋ฅผ ์์ฑํ์ญ์์ค. ๊ฑฐ๊ธฐ์๋ถํฐ ์งํํ๊ฒ ์ต๋๋ค. ๋ค์์ ๋ฌธ์ ์ ๋ํ ๋ช ๊ฐ์ง ์ฌ์ค์ ๋๋ค.
bluebird-global
๊ฐ .map()
์ ํจ๊ป ํ๋ ๋ชจ๋ ๊ฒ์ bluebird.d.ts
์ .map()
์ ํ ์ ์๋ฅผ ์ฌ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค. ์ฆ, bluebird-global
ํ์ดํ์์ ๊ฒฐํจ์ด ๋ฐ์ํด์๋ ์๋ฉ๋๋ค.Promise.map()
์์ ์คํจํ์ง๋ง Bluebird.map()
์์๋ ์๋ํฉ๋๋ค.import Bluebird = require('bluebird');
Bluebird.resolve([3]).map((n: number) => true); // works
Promise.resolve([3]).map((n: number) => true); // fails
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
)์ ์ํด ๋ฐํ๋๋ ์ ํ ๊ฐ์ ์ผ์นํ์ง ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์๋ ํ์ธ์ ์ฌ๋ฌ๋ถ,
@types/bluebird-global
์(๋ฅผ) ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ฌํ ํ์ดํ์ ๋ณด๋ ์๋์@types/bluebird@^3.0
๋ฅผ ์ฌ์ฉํ๊ณ ๊ธ๋ก๋ฒPromise
์์ ๋ธ๋ฃจ๋ฒ๋์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์๋๋ก ํฉ๋๋ค(์ฆ, ts ์ปดํ์ผ์ด ์คํจํ์ง ์์).์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋ณด๋ ค๋ฉด ์ด๊ฒ์ ์ฝ์ผ์ญ์์ค.