Definitelytyped: bluebird 3.0 ์ •์˜๋Š” ES6 Promise์— ํ• ๋‹นํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

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

bluebird 3.0 ์ •์˜๋Š” ํ‘œ์ค€ es6 Promise ์ •์˜์— ํ• ๋‹นํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

Types of property 'then' are incompatible.
Type 'Bluebird<any>' is not assignable to type 'Promise<any>'.

/cc @lhecker

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

@silentorb @types/bluebird-global ์œ ํ˜• ์ •์˜๋ฅผ ์‚ฌ์šฉํ•œ ๋‹ค์Œ ๋‚ด ์ฝ”๋“œ ์ƒ๋‹จ์— ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ „์—ญ ์•ฝ์† ์ •์˜(ES2015 ํ”Œ๋žซํผ์„ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ๊ฒฝ์šฐ ๊ฐ–๊ฒŒ ๋จ)๋ฅผ ์žฌ์ •์˜ํ•˜์—ฌ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์‹คํ–‰ ์ง„์ž…์ :

import * as Promise from 'bluebird';
global.Promise = require('bluebird');

์œ„์˜ ๋‚ด์šฉ์€ ๋…ธ๋“œ ํ™˜๊ฒฝ์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค(์ €๋Š” 6.10.x๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค). ์›นํŒฉ ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ _expose-loader_์™€ ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

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

@Strate tsc์˜ ๋‚˜๋จธ์ง€ ์ถœ๋ ฅ์„ ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ฆฌ๊ณ  ๋กœ์ปฌ bluebird.d.ts ์„ ์—ด๊ณ  #10831 ์—์„œ ์ด ํ•œ ์ค„์„ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค. ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๊นŒ?

์ „์ฒด ์˜ค๋ฅ˜:

error TS2322: Type '(entity: BaseEntity) => Bluebird<{ contentType: "ActivityDesktopWidget" | "AddressType" | "Approv...' is not assignable to type 'UpdateEntityFunction<BaseEntity>'.
  Type 'Bluebird<{ contentType: "ActivityDesktopWidget" | "AddressType" | "Approval" | "BaseIntegrationEn...' is not assignable to type 'Promise<BaseEntity>'.
    Types of property 'then' are incompatible.
      Type '{ <U>(onFulfill: (value: { contentType: "ActivityDesktopWidget" | "AddressType" | "Approval" | "B...' is not assignable to type '{ <TResult1, TResult2>(onfulfilled: (value: BaseEntity) => TResult1 | PromiseLike<TResult1>, onre...'.
        Type 'Bluebird<any>' is not assignable to type 'Promise<any>'.

๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜๊ณ  [email protected] ๊ฐ€์ง„ lib.es2016.d.ts ํŒŒ์ผ. ํ•ด๋‹น ์ค„์„ ์ถ”๊ฐ€ํ•ด๋„ ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋ณผ ์•„ ... ๋‚˜๋Š”์— ์˜ํ•œํ•˜๋‹ค๊ณ  ์ƒ๊ฐ ์ด ๋ผ์ธ์ด ๋ˆ„๋ฝ ์—ฌ๊ธฐ . ์ด๊ฒƒ์€ ํ˜„์žฌ ํƒ€์ดํ•‘์œผ๋กœ onFulfill ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ onReject ์—์„œ ๋™์ผํ•œ ์œ ํ˜• U ์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€ npm๊ณผ ์ด dt ์ €์žฅ์†Œ btw์—์„œ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ •๋ง ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ ๋™์•ˆ์—๋Š” .then(success, failure) ๋ฅผ .then(success).catch(failure) ๋กœ ๋ถ„ํ• ํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ณต์‹ ๊ตฌ๋ฌธ์˜ ์ผ๋ถ€์ด์ง€๋งŒ ์–ด์จŒ๋“  bluebird์—์„œ "์„ ํ˜ธํ•˜๋Š”" ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

๋Œ€์•ˆ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ๋ฐ˜ ๋งค๊ฐœ๋ณ€์ˆ˜ U ์ˆ˜๋™์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

.then<SomeType>(() => new SomeType(), (err) => 123); // This is an explicit error because SomeType != number

๋‘ ์ฝœ๋ฐฑ์—์„œ ๋™์ผํ•œ ์œ ํ˜•์„ ๋ฐ˜ํ™˜ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

@lhecker ํ•˜์ง€๋งŒ then ๋˜๋Š” catch ๋„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๋Ÿฐ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค :

// module 1. Note that bluebird is not imported
export default function<T>(promise: Promise<T>) {} // es6 promise used here

// module 2.
import Promise from "bluebird"
import handler from "./module1"
const promise: Promise<any>
handler(promise) // <-- error is here

bluebird.d.ts es6์˜ ์„ ์–ธ๊ณผ ํ˜ธํ™˜๋˜๋Š” ๋˜ ๋‹ค๋ฅธ then ์„ ์–ธ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์•„ ์  ์žฅ... ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋“œ๋””์–ด ํœด์‹์„ ์ทจํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๐Ÿ˜‚

๋”ฐ๋ผ์„œ ๊ทธ๋™์•ˆ ๋ฌด์—‡์„ ํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๋‚ด ์˜๊ฒฌ์„ ๋ฌด์‹œํ•˜์‹ญ์‹œ์˜ค. ์–ด์จŒ๋“  ๋ˆ„๋ฝ๋˜์–ด ์žˆ๊ณ  ์ด์™€ ๊ฐ™์€ ๊ธฐ๋ณธ ์ง€์› ์ด์™ธ์˜ ์ž‘์—…์„ ํ•  ์‹œ๊ฐ„์ด ์‹ค์ œ๋กœ ์—†๊ฑฐ๋‚˜ ์ ์–ด๋„ "ํ•ด์„œ๋Š” ์•ˆ ๋˜๊ธฐ ๋•Œ๋ฌธ์—" ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ ํฌ๊ฒŒ ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. PR์„ ๋ณด๋‚ด ๋‘ ํ”„๋กœ์ ํŠธ์— ํ•ด๋‹น ํƒ€์ดํ•‘์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜Š

@lhecker ์™„๋ฃŒ :)

์ฐธ๊ณ ๋กœ ์ €๋Š” ์•ฝ์†์„ ์ˆ˜๋ฝํ•  ๋•Œ ํ•ญ์ƒ PromiseLike ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์•ฝ์†์„ ์ˆ˜๋ฝํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„๋œ ์ตœ์†Œ ์•ฝ์† ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์„ ํƒ์˜ ์•ฝ์† ์œ ํ˜•์„ ๋ฐ˜ํ™˜ํ•˜์—ฌ ๋งŽ์€ ์ถ”๊ฐ€ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋Š” Bluebird<T> ์ฒ˜๋Ÿผ ๋” ์—„๊ฒฉํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋žซ๋™์•ˆ ES6 Promise ์œ ํ˜•์— ES6 ๊ธฐํ˜ธ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด Promise ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ํ• ๋‹นํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

@blakeembrey ์‚ฌ์šฉํ•˜์—ฌ PromiseLike PromiseLike๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—์ด ๊ฒฝ์šฐ์— ๋Œ€๋‹ต์€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค ๋‹ค์Œ์˜ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๋ฒ„์ „์ด

: ๋ถˆํ–‰ํ•˜๊ฒŒ๋„ ์•ฝ์† typings ๋” ์ด์ƒ ๋Œ€์‘ TS ๋ฒ„์ „ 2์—์„œ ์ด๋Ÿฌํ•œ typings ์žˆ๋„๋ก ๋ณ€๊ฒฝ https://github.com/Microsoft/TypeScript/blob/070aa83cc06b2974639bbefcde98e6e2fb5fe693/src/lib/es2015.promise.d.ts

์ด ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ์—ด ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@OliverJAsh @arg20 ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ž์ฒด ์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ํ…Œ์ŠคํŠธ ์‚ฌ๋ก€๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@Strate ์—ฌ๊ธฐ์— ๋‚ด ์˜ค๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. typescript 2.0.3(lib.es6.d.ts) ๋ฐ @types/bluebird v3.0.33 ์‚ฌ์šฉ

error TS2345: Argument of type 'Bluebird<Db>' is not assignable to parameter of type 'Promise
<Db>'.                                                                                                            
  Types of property 'then' are incompatible.                                                                      
    Type '{ <U1, U2>(onFulfill: (value: Db) => U1 | Thenable<U1>, onReject: (error: any) => U2 | Thenable<U...' is
 not assignable to type '{ <TResult1, TResult2>(onfulfilled: (value: Db) => TResult1 | PromiseLike<TResult1>, onre
jected: ...'.                                                                                                     
      Type 'Bluebird<any>' is not assignable to type 'Promise<any>'.                                              
        Types of property 'then' are incompatible.                                                                
          Type '{ <U1, U2>(onFulfill: (value: any) => U1 | Thenable<U1>, onReject: (error: any) => U2 | Thenable<.
..' is not assignable to type '{ <TResult1, TResult2>(onfulfilled: (value: any) => TResult1 | PromiseLike<TResult1
>, onrejected:...'.                                                                                               
            Type 'Bluebird<any>' is not assignable to type 'Promise<any>'.              

Bluebird Promise๋ฅผ ES6 Promise๋กœ ์บ์ŠคํŒ…ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ๋‹ค์Œ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค( bluebirdPromise as Promise<Db> ).

 error TS2352: Type 'Bluebird<Db>' cannot be converted to type 'Promise<Db>'.                 
  Types of property 'then' are incompatible.                                                                      
    Type '{ <U1, U2>(onFulfill: (value: Db) => U1 | Thenable<U1>, onReject: (error: any) => U2 | Thenable<U...' is  not comparable to type '{ <TResult1, TResult2>(onfulfilled: (value: Db) => TResult1 | PromiseLike<TResult1>, onrejected: ...'.                                                                                                     
      Type 'Bluebird<any>' is not comparable to type 'Promise<any>'.                                              
        Property '[Symbol.toStringTag]' is missing in type 'Bluebird<any>'.         

# 10831์—์„œ ์ œ์•ˆํ•œ๋Œ€๋กœ ์ด๊ฒƒ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์ €์—๊ฒŒ ํšจ๊ณผ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

readonly [Symbol.toStringTag]: 'Promise';

๋˜ํ•œ ES6 Promise๋กœ ๋ณ€ํ™˜ํ•˜๋ฉด ํŠธ๋ฆญ์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

return new Promise.resolve(bluebirdPromise)

@jmendiara #10831์— ์–ธ๊ธ‰๋œ ๊ฒƒ์ฒ˜๋Ÿผ ์‹ค์ œ๋กœ bluebird์—๋Š” readonly [Symbol.toStringTag] ๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์ด๊ฒƒ์„ bluebird.d.ts์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ํ™•์‹คํžˆ ์ž˜๋ชป๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํƒ€์ดํ•‘์€ ์‹ค์ œ ์„ธ๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
Promise ํ‘œ์ค€์ด readonly [Symbol.toStringTag] ์š”๊ตฌํ•œ๋‹ค๋ฉด, ๊ทธ๊ฒƒ์€ bluebird ์ž์ฒด์™€ bluebird.d.ts์—๋„ ์ถ”๊ฐ€๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ธ”๋ฃจ๋ฒ„๋“œ์™€ ๋„ค์ดํ‹ฐ๋ธŒ ํ”„๋ผ๋ฏธ์Šค ๊ฐ„์˜ ๋ณ€ํ™˜์„ ํ™•์‹คํžˆ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค(์ •๋ง ์งœ์ฆ๋‚˜๋„ค์š”).
์ฐธ๊ณ ๋กœ new ํ‚ค์›Œ๋“œ ์—†์ด Promise.resolve ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

bluebird์˜ ์•ฝ์†์„ ํ‘œ์ค€ ์•ฝ์†์— ํ• ๋‹นํ•  ์ˆ˜ ์—†์„ ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ œ ๊ฒฝ์šฐ์—๋Š” bluebird๋ฅผ Promise.resolve ๋กœ ํ‘œ์ค€์œผ๋กœ ์บ์ŠคํŒ…ํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ทธ๊ฒƒ์€ ์ œ3์ž ๊ฐ์ฒด์— ๊นŠ์ˆ™์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋•Œ๋•Œ๋กœ ๋ณ€ํ™˜ ์—†์ด ํ‘œ์ค€์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” bluebird์˜ ์•ฝ์†์„ ๊ฐ–๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค.
bluebird์˜ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ๊ธฐ๋Šฅ ์š”์ฒญ์„ ์ƒ์„ฑํ•˜์—ฌ bluebird์˜ ์ธ์Šคํ„ด์Šค์— Symbol.toStringTag ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

https://github.com/petkaantonov/bluebird/issues/1277

์ด์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด ์Šค๋ ˆ๋“œ๋ฅผ ์ฐพ์•„์„œ ๊ธฐ์ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ฏธ์ณค๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” SO ์— ๋Œ€ํ•œ ๋‚ด ๋ฌธ์ œ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ์„ค๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค.

@types/bluebird 3.5.3 ๋ฐ TypeScript 2.2.2์—์„œ ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

@silentorb @types/bluebird-global ์œ ํ˜• ์ •์˜๋ฅผ ์‚ฌ์šฉํ•œ ๋‹ค์Œ ๋‚ด ์ฝ”๋“œ ์ƒ๋‹จ์— ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ „์—ญ ์•ฝ์† ์ •์˜(ES2015 ํ”Œ๋žซํผ์„ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ๊ฒฝ์šฐ ๊ฐ–๊ฒŒ ๋จ)๋ฅผ ์žฌ์ •์˜ํ•˜์—ฌ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์‹คํ–‰ ์ง„์ž…์ :

import * as Promise from 'bluebird';
global.Promise = require('bluebird');

์œ„์˜ ๋‚ด์šฉ์€ ๋…ธ๋“œ ํ™˜๊ฒฝ์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค(์ €๋Š” 6.10.x๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค). ์›นํŒฉ ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ _expose-loader_์™€ ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

@ksnyde : ์ด์ „์— @types/bluebird-global ์‚ฌ์šฉํ•ด ๋ณด์•˜๊ณ  ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ˆ„๋ฝ๋œ Promise ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. @types/bluebird-global ํŒจ์น˜๋ฅผ ๊ณ ๋ คํ–ˆ์ง€๋งŒ @types/bluebird ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

@silentorb ํ•ต์‹ฌ์€ ์ „์—ญ Promise ์ฐธ์กฐ๋ฅผ ์žฌ์ •์˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋ฅผ ์œ„ํ•ด ๋ฌธ์ œ์—†์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋ฉด ํ™•์‹คํžˆ ์ข‹๊ฒ ์ง€๋งŒ ์ด ์†”๋ฃจ์…˜์œผ๋กœ ๊ธฐ๋‹ค๋ฆด ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ์ง„์ „์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ๋˜ํ•œ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜๋กœ ์š”์•ฝ๋ฉ๋‹ˆ๋‹ค.

type Promise<any> is not assignable to Bluebird<any>

๋งค์šฐ ์‹ค๋ง์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋˜ํ•œ sequelize ์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ํƒ€์ดํ•‘ ํŒจํ‚ค์ง€์˜ ์‚ฌ์šฉ๋ฒ•์„ ๊นจ๋œจ๋ฆฝ๋‹ˆ๋‹ค.

export interface MissionModel extends Sequelize.Model<MissionInstance, MissionAttributes. {
    create(missionAttributes: MissionAttributes, opsions?: Sequelize.CreateOptions): Promise<MissionInstance>;
}

MissionModel Promise ๋ฅผ * from "bluebird" ๋กœ ๊ฐ€์ ธ์˜ค์ง€ ์•Š์œผ๋ฉด MissionModel ์— ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

src\server\models\mission.ts(3,18): error TS2430: Interface 'MissionModel' incorrectly extends interface 'Model<MissionInstance, MissionAttributes>'.
  Types of property 'create' are incompatible.
    Type '(MissionAttributes: MissionAttributes, option?: CreateOptions | undefined) => Promise<MissionInst...' is not assignable to type '(values?: MissionAttributes | undefined, options?: CreateOptions | undefined) => Bluebird<Mission...'.
      Type 'Promise<MissionInstance>' is not assignable to type 'Bluebird<MissionInstance>'.
        Types of property 'then' are incompatible.
          Type '<TResult1 = MissionInstance, TResult2 = never>(onfulfilled?: ((value: MissionInstance) => TResult...' is not assignable to type '{ <U>(onFulfill?: ((value: MissionInstance) => U | PromiseLike<U>) | undefined, onReject?: ((erro...'.
            Type 'Promise<any>' is not assignable to type 'Bluebird<any>'.

@Strate ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ์—ด์–ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?
๋‹ค์‹œ ์ƒ๊ฐํ•ด๋ณด๋ฉด, ๋‚˜๋Š” ์ƒˆ๋กญ๊ณ  ๋” ํ‘œ์ ์ด ๋˜๋Š” ๊ฒƒ์„ ์ œ์ถœํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์‹œ๊ฐ„์„ ๋‚ญ๋น„ํ•˜๋Š” ๊ฒƒ์„ ์ •๋ง ์‹ซ์–ดํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๊ฐ€ ๋งค์šฐ ๋ช…ํ™•ํ•˜๊ธฐ ๋•Œ๋ฌธ์— tsc๋ฅผ ์ „๋‹ฌํ•˜๋ ค๋ฉด ๋” ๋งŽ์€ ์ถ”๊ฐ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ˆ˜์ •ํ•˜๋Š” ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ ๋ชจ๋“  ์œ ํ˜•์˜ ์ž„์‹œ ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋Œ€์ƒ Promise๋กœ ๋ณ€ํ™˜ํ•˜์‹ญ์‹œ์˜ค. ์™€ ๊ฐ™์€:

'''
const p: ๋ชจ๋“  = getPromise();
๋ฐ˜ํ’ˆ>ํ”ผ;
'''

@flyingsky (et. al.) ์šฐ์„  Bluebird Promise๊ฐ€ ๊ธฐ๋ณธ ๊ตฌํ˜„์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” ํ™•์žฅ์„ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ Promise๋ฅผ Bluebird์— ์ง์ ‘ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์€ ๊ฒฐ์ฝ” ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์ ์„ ๋‹ค์‹œ ํ•œ ๋ฒˆ ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ์ƒ๊ธฐ์‹œํ‚ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด์— ๊ธฐ๋ณธ ์•ฝ์†์— Bluebird ์•ฝ์†์„ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€๋Šฅํ•ด์•ผ ํ•˜๋ฉฐ ๋‹น์—ฐํžˆ ๊ทธ๋ž˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๊ธฐ ์žˆ๋Š” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์€ ์ด๊ฒƒ์ด ์ง€๊ธˆ ๋‹น์žฅ์€ ํšจ๊ณผ๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ์ธ์ƒ์„ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํ™•์‹คํžˆ ์‚ฌ์‹ค์ด ์•„๋‹™๋‹ˆ๋‹ค.

๊ทธ ์ด์œ ๋Š” Bluebird๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ์•Œ๋ ค์ง„ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๊ธฐ๋ณธ ํ˜ธํ™˜ ๋ฐฉ์‹์œผ๋กœ ๋…ธ์ถœํ•˜์ง€๋งŒ ํŠน์ • ํ•„๋“œ ํ•˜๋‚˜๋ฅผ _๋…ธ์ถœํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. [Symbol.toStringTag] ํ•„๋“œ๋Š” "promise" ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค: https://github.com/petkaantonov/bluebird/issues/1277. ์ด๋กœ ์ธํ•ด Bluebird๋Š” ๊ธฐ๋ณธ ์•ฝ์†๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ์—„๊ฒฉํ•˜๊ฒŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ˆ˜...

const p: any = getPromise();
return <Promise>p;

์ด๊ฒƒ์€ ๊ธฐ์ˆ ์ ์œผ๋กœ ์•ˆ์ „ํ•˜์ง€ ์•Š๊ณ  ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์€ ์œ ํ˜•์ž…๋‹ˆ๋‹ค.

@types/bluebird-global ํŒจ์น˜๋ฅผ ๊ณ ๋ คํ–ˆ์ง€๋งŒ @types/bluebird ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

bluebird-global ๋Š” bluebird ์™„์ „ํžˆ ๋‹ค๋ฅธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Promise ๋ณ€์ˆ˜๋ฅผ ๋ฎ์–ด์“ฐ๋Š” ๋งค์šฐ ์œ„ํ—˜ํ•œ ์œ ํ˜•์˜ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์— ์กด์žฌํ•ฉ๋‹ˆ๋‹ค Bluebird . (๋‹จ์ˆœํžˆ ๋ฎ์–ด์“ด๋‹ค๊ณ  ํ•ด์„œ ์˜์กดํ•˜๋Š” ๋ชจ๋“  ํŒจํ‚ค์ง€๊ฐ€ ๋„ค์ดํ‹ฐ๋ธŒ ํ”„๋ผ๋ฏธ์Šค๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์˜๋ฏธ๋Š” ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์•ˆ์ „ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)

์ด ๋ฌธ์ œ์˜ ์ง„ํ–‰ ์ƒํ™ฉ์„ ๋ณด๊ณ  ์‹ถ์€ ์‚ฌ๋žŒ์ด ์žˆ์œผ๋ฉด ์ด๋ฏธ ์–ธ๊ธ‰ํ•œ Bluebird ๋ฌธ์ œ์— ๋Œ€ํ•œ PR์„ ์—ฌ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. https://github.com/petkaantonov/bluebird/issues/1277

์ด ๋ฌธ์ œ์˜ ์ง„ํ–‰ ์ƒํ™ฉ์„ ๋ณด๊ณ  ์‹ถ์€ ์‚ฌ๋žŒ์ด ์žˆ์œผ๋ฉด ์ด๋ฏธ ์–ธ๊ธ‰ํ•œ Bluebird ๋ฌธ์ œ์— ๋Œ€ํ•œ PR์„ ์—ฌ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. petkaantonov/bluebird#1277

์ด PR์ด ์ƒ์„ฑ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค: https://github.com/petkaantonov/bluebird/pull/1421

@ksnyde โ€“ ๊ท€ํ•˜์˜ @types/bluebird-global ์ œ์•ˆ์ด ์ €์—๊ฒŒ ํšจ๊ณผ์ ์ด๋ฉฐ ์•ฝ๊ฐ„ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

import * as Promise from 'bluebird'
global.Promise = Promise

๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋‚ด๊ฐ€ ์–ป์„ error TS6133: 'Promise' is declared but its value is never read. ์˜ˆ์ƒ๋˜๋Š” tsconfig.json ์™€ "noUnusedLocals": true .

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

bluebird-global ์žˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

'Bluebird ์œ ํ˜•'์— '[Symbol.toStringTag]' ์†์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค.'

์ด ์ค„์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ์ˆ˜์ •๋ฉ๋‹ˆ๋‹ค. https://github.com/DefinitelyTyped/DefinitelyTyped/pull/10831/files

๋ธ”๋ฃจ๋ฒ„๋“œ์˜ ํƒ€์ดํ•‘์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ๋กœ์ปฌ์—์„œ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

+1

@gdpaulmil ๊ฑด์„ค์ ์ธ ์˜๊ฒฌ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

Bluebird์˜ ์ƒํ™ฉ์„ ์‚ดํŽด๋ณด๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
https://github.com/petkaantonov/bluebird/pull/1421 ์ด 11์ผ ์ „์— ๋ณ‘ํ•ฉ๋˜์–ด ๋งˆ์นจ๋‚ด Symbol.toStringTag ๋Œ€ํ•œ ์ง€์›์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค! ๐ŸŽ‰

์ด๋Š” ๋‹ค์‹œ #10831์„ ๋‹ค์‹œ ์ œ์ถœํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ์ฆ‰์‹œ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. "Promise" ๋ฅผ "Object" ๋กœ ๋ฐ”๊พธ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์†”์งํžˆ ๋ฐ”๋กœ ๋ฆฌ๋ทฐํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๐Ÿ™‚

@lhecker , ์ด ๋ชจ๋“  ๊ฒƒ์„ ์ •๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด #35353์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค!

์ด ๋ฌธ์ œ๊ฐ€ @types/bluebird v3.5.27์—์„œ ์ˆ˜์ •๋˜์—ˆ์Œ์„ ์•Œ๋ ค๋“œ๋ฆฝ๋‹ˆ๋‹ค.
์ด์ œ ์ด ๋ชจ๋“  Bluebirds๋ฅผ ์ด ๋ชจ๋“  Promise์— ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์„ ์ฆ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐ŸŽ‰
ํ•˜์ง€๋งŒ ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” TypeScript 3.2 ์ด์ƒ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (#34805 ์ฐธ์กฐ)

์ถ”์‹ : Bluebird PR์„ ์ฒ˜๋ฆฌํ•ด ์ฃผ์‹  @JoshuaKGoldberg ์—๊ฒŒ ๋‹ค์‹œ ํ•œ ๋ฒˆ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๐Ÿ™‚๐Ÿ‘

์ด๋‹ค:

import * as Promise from 'bluebird';
global.Promise = require('bluebird');

es2017์—๋„ ๊ณ„์† ์ ์šฉ๋˜๋‚˜์š”?

์ด์ „ ๋ฒ„์ „์„ ์ข…์†์„ฑ์œผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ๋ฉ”๋ชจ๋ฅผ ๋ฐ›์ง€ ๋ชปํ•œ ๋‹ค๋ฅธ ๋ชจ๋“  ํŒจํ‚ค์ง€๋ฅผ ์ œ์™ธํ•˜๊ณ ... request-promise, knex,... ๋‹น์‹ ์€ ์ด๋ฒˆ ์—…๋ฐ์ดํŠธ๋กœ ๋งŽ์€ ์ฝ”๋“œ๋ฅผ ๊นจ๋œจ๋ ธ์Šต๋‹ˆ๋‹ค. Typescript ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋ชจ๋“  ๊ณณ์—์„œ ๋ง๋„ ์•ˆ๋˜๋Š” ์˜ค๋ฅ˜๋ฅผ ๋˜์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Typescript 3.3, 3.4, 3.5...๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ ๋„์›€์ด๋œ๋‹ค๋ฉด ์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์ „์—ญ Promise ๊ฐœ์ฒด๋ฅผ BB๋กœ ๋ฐ”๊พธ์ง€ ์•Š๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์‰ฌ์› ์Šต๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€๊ฐ€ ๋‹ค๋ฅธ ๊ฒƒ๊ณผ ํ˜ธํ™˜๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

@jacklinton ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๋ชจ๋“  ํŒจํ‚ค์ง€๊ฐ€ "๋ฌด์˜๋ฏธํ•œ ์˜ค๋ฅ˜๋ฅผ ๋˜์ง€์ง€" ์•Š๊ณ  ์—ฌ์ „ํžˆ ์ฃผ์–ด์ง„ TypeScript ๋ฒ„์ „์œผ๋กœ ๋นŒ๋“œ๋˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๊ฐ€ ๋งˆ๋ จ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ด๋ฏธ ์•Œ๊ณ  ๊ณ„์‹ค ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ์€ ์ตœ์‹  Bluebird ํƒ€์ดํ•‘์œผ๋กœ ์ž‘์—…ํ•˜๋Š” ์š”์ฒญ ์•ฝ์†์„ ๋ณด์—ฌ์ฃผ๋Š” ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค. https://github.com/lhecker/request-promise-sample
๊ท€ํ•˜์˜ ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๊ท€ํ•˜๊ฐ€ ๋ณด๊ณ  ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์ตœ์†Œํ•œ์˜ ์˜ˆ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ •๋ง ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์–ด๋””์„œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์•ผ ํ• ์ง€ ์•Œ๊ธฐ ์–ด๋ ต์ง€๋งŒ ๋‹ค๋ฅธ ๋ชจ๋“  ํŒจํ‚ค์ง€๋Š” ์ตœ์‹  ์ƒํƒœ์ž…๋‹ˆ๋‹ค.
Error:(19, 3) TS2741: Property '[Symbol.toStringTag]' is missing in type 'Bluebird<string[]>' but required in type 'Bluebird<string[]>'.
@types/bluebird๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ์ด๋Ÿฌํ•œ ์˜ค๋ฅ˜๊ฐ€ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ฐ€์ง„ ์‹œ๊ฐ„์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ์ถ”์ธก์€ ์ด๋Ÿฌํ•œ ์œ ํ˜•์„ ํ•„์š”๋กœ ํ•˜๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ํŒจํ‚ค์ง€๊ฐ€ ์•„์ง ๋”ฐ๋ผ์žก์ง€ ๋ชปํ–ˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Knex๊ฐ€ ๋ฒ”์ธ์ผ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ์˜์‹ฌ๋˜์ง€๋งŒ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ํŒจํ‚ค์ง€์˜ ์ด์ „ ๋ฒ„์ „์— ๋Œ€ํ•œ ์ž์ฒด ์ข…์†์„ฑ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

์ด ์˜ค๋ฅ˜๋Š” @types/bluebird ์˜ ๋‘ ๊ฐ€์ง€ ๋ฒ„์ „์ด ์„ค์น˜๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๋‹น์‹ ์ด ๊ทธ๋“ค ์ค‘ ํ•˜๋‚˜๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋„๋ก ๊ทธ ๋‚˜๋ฌด๋ฅผ ํ‰ํ‰ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์‹œ๋„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

knex 0.17.3์€ @types/bluebird ํƒ€์ดํ•‘ btw์˜ ์ตœ์‹  3.5.27 ๋ฒ„์ „์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ตœ์‹  ๋ฒ„์ „์˜ knex๊ฐ€ ์žˆ์œผ๋ฉด ์‹ค์ œ๋กœ ์ž‘๋™ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
@types/bluebird ์˜ ๋‘ ๋ฒˆ์งธ ์‚ฌ๋ณธ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ 3.5.27์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์‘๋‹ต ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

@lhecker ์š”์ฒญ-์•ฝ์†-์ƒ˜ํ”Œ ์ด ์‚ฌ๋ผ์ง„ ๊ฒƒ ๊ฐ™์•„์„œ ๋‹ค์‹œ ๊ฒŒ์‹œํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๐Ÿ˜ข

@VictorioBerra ์™€ ํŠธ๋ฆญ

import * as Promise from 'bluebird';
global.Promise = require('bluebird');

Node.js 12์—์„œ ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

global.Promise = ์•ฝ์†;
'typeof Bluebird' ์œ ํ˜•์—๋Š” 'Function' ์œ ํ˜•์—์„œ ๋‹ค์Œ ์†์„ฑ์ด ๋ˆ„๋ฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ ์šฉ, ํ˜ธ์ถœ, ๋ฐ”์ธ๋”ฉ, ๊ธธ์ด ๋ฐ ๊ธฐํƒ€ 4๊ฐœ.

TypeScript v3.7.4, bluebird v3.7.2 ๋ฐ @types/bluebird-global v3.5.12๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@bennyn ๋” ์ด์ƒ ์ฝ”๋“œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋งค์šฐ ๋ฏธ์•ˆ ํ•ด์š”. ์š”์ฒญ-์•ฝ์† ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋œ ํ›„ ์‚ญ์ œํ–ˆ์Šต๋‹ˆ๋‹ค.
3.5.29์—์„œ ์ตœ์‹  ๋ฒ„์ „์˜ @types/bluebird ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

๋ชจ๋“  bluebird, @types/bluebird-global ๋ฐ TypeScript์˜ ์ตœ์‹  ๋ฒ„์ „์—์„œ @bennyn ๊ณผ ๋™์ผํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ๋ฒ„์ „์˜ Bluebird 3.7.2 ๋ฐ TypeScript 3.6์—์„œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์œ ์ผํ•œ ์˜ต์…˜์€ Bluebird ํƒ€์ดํ•‘์„ ์ „ํ˜€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•ฑ ์ง„์ž…์ ์—์„œ ๋„ค์ดํ‹ฐ๋ธŒ Promise ์ƒ์„ฑ์ž๋ฅผ Bluebird๋กœ ๋ฐ”๊พธ๊ณ  ๊ทธ ํ›„์— ๋„ค์ดํ‹ฐ๋ธŒ Promise API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Bluebird๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

import * as Bluebird from "bluebird";
global.Promise = Bluebird;

new Promise((resolve, reject) => {
  // this is actually a Bluebird object
});

๋‚˜๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ์†”์งํžˆ ๋งํ•ด์„œ ๋„ˆํฌ๋“ค์ด ๋„ˆํฌ ์ชฝ์—์„œ ๋ญ”๊ฐ€ ์ž˜๋ชปํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๋ฏฟ๋Š”๋‹ค. ๐Ÿ˜–
๋‚˜๋Š” ๋‹น์‹ ์ด ์–ด๋–ป๊ฒŒ ์ ˆ๋Œ€์ ์œผ๋กœ 100% ํ™•์‹คํžˆ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ณด์—ฌ์ฃผ๋Š” ์ตœ์†Œํ•œ์˜ request-promise-sample ํ”„๋กœ์ ํŠธ ๋ฅผ ์žฌ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

  • Bluebird ์ƒ์„ฑ์ž๋ฅผ global.Promise ํ• ๋‹น
  • ์ปดํŒŒ์ผ ์˜ค๋ฅ˜ ์—†์ด request-promise ์‚ฌ์šฉ
  • Bluebird ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค๋ฅผ Promise ์ธํ„ฐํŽ˜์ด์Šค์— ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค (์ด๊ฒƒ์ด ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค).

_ํ•˜์ง€๋งŒ ์ด ๋ฌธ์ œ๋Š” ์ข…๋ฃŒ๋˜์—ˆ์œผ๋ฉฐ ์ฃผ์ œ์—์„œ ๋ฒ—์–ด๋‚œ ํ† ๋ก ์„ ๊ณ„์†ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค._
์ด ํ‹ฐ์ผ“์€ ES6/๋„ค์ดํ‹ฐ๋ธŒ ํ”„๋ผ๋ฏธ์Šค์— ํ• ๋‹นํ•  ์ˆ˜ ์—†๋Š” Bluebird ํ”„๋ผ๋ฏธ์Šค์— ๊ด€ํ•œ ๊ฒƒ์ด๋ฏ€๋กœ ์œ„์˜ ๋…ผ์˜๋Š” ์ฃผ์ œ์—์„œ ๋ฒ—์–ด๋‚ฌ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์œ„์— ํ‘œ์‹œ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ์ด ๋ฌธ์ œ๋Š” ์˜ค๋žซ๋™์•ˆ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
Bluebird์—์„œ @types/[email protected] ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋Œ€์‹  https://github.com/DefinitelyTyped/DefinitelyTyped/issues/42084 ๋ฅผ ์ฐธ์กฐ

@lhecker
๋‹ต๋ณ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
Annotation 2020-03-21 084422

@types/[email protected] ์„ค์น˜๋„ ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
Annotation 2020-03-21 084750

์ˆ˜์ •๋œ ํ”„๋กœ์ ํŠธ๋Š” ์—ฌ๊ธฐ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
https://github.com/chebum/request-promise-sample

@chebum ์œ„์˜ ๊ท€ํ•˜์˜ ์˜๊ฒฌ์€ Bluebird<T> ๋ฐ˜ํ™˜ํ•˜๋Š” ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ์ž…๋ ฅํ•˜๋ ค๊ณ  ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ถ„๋ช…ํžˆ ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” ๋ถˆํ–‰ํžˆ๋„ ์ด๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ด๋ฏธ ๋งํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์ถœ๋ ฅ์—์„œ โ€‹โ€‹๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ๋น„๋™๊ธฐ ํ•จ์ˆ˜์—์„œ Promise<T> ์œ ํ˜•์„ _๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ˜•์‹ ์•ˆ์ „์„ฑ์„ ์•ฝ๊ฐ„ ํฌ๊ธฐํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. @types/bluebird-global ๋ฅผ ์ข…์†์„ฑ์œผ๋กœ ์ถ”๊ฐ€
  2. ์ „์—ญ Promise ์ƒ์„ฑ์ž ์žฌ์ •์˜: window.Promise = Bluebird as any;
  3. ์“ฐ๊ธฐ: async function testFn(): Promise<void>
  4. ์ „์—ญ Promise<T> ์œ ํ˜•์€ ์ด์ œ Bluebird<T> ์™€ ๊ฑฐ์˜ ๋™์ผํ•˜๋ฉฐ ๋ชจ๋“  ์ค‘์š”ํ•œ Bluebird ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Symbol.species ์˜ค๋ฅ˜ ๋“ฑ์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค๋ฉด ์ด ํ‹ฐ์ผ“์„ _์‚ฌ์šฉํ•˜์ง€ ๋ง๊ณ _ #42084๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

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