Typescript: Object.assign 지원에 λŒ€ν•œ λ‘œλ“œλ§΅μ΄ μžˆμŠ΅λ‹ˆκΉŒ?

에 λ§Œλ“  2015λ…„ 06μ›” 09일  Β·  47μ½”λ©˜νŠΈ  Β·  좜처: microsoft/TypeScript

1.6 λ˜λŠ” 2.0μ—μ„œ?

Question

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

이해가 μ•ˆ λΌμ„œ λ―Έμ•ˆ ν•΄μš”. ES6λŠ” Object.assign ν•˜λ―€λ‘œ Babel은 ES5 λŒ€μƒμ„μœ„ν•œ 폴리 ν•„λ‘œ λ³€ν™˜ν•©λ‹ˆλ‹€. TypeScriptκ°€ λ‹€λ₯Έ ES6 κΈ°λŠ₯κ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ λ™μΌν•œ κΈ°λŠ₯을 μˆ˜ν–‰ν•˜μ§€ μ•ŠλŠ” μ΄μœ κ°€ ν—·κ°ˆλ¦½λ‹ˆλ‹€.

λͺ¨λ“  47 λŒ“κΈ€

무엇을 μ°Ύκ³  μžˆλŠ”μ§€ ν™•μ‹€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 타이핑을 μ˜λ―Έν•œλ‹€λ©΄ lib.es6.d.ts에 이미 λ‹€μŒκ³Ό 같이 μ •μ˜λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

    /**
      * Copy the values of all of the enumerable own properties from one or more source objects to a 
      * target object. Returns the target object.
      * <strong i="6">@param</strong> target The target object to copy to.
      * <strong i="7">@param</strong> sources One or more source objects to copy properties from.
      */
    assign(target: any, ...sources: any[]): any;

κ΅¬ν˜„μ„ μ˜λ―Έν•©λ‹ˆλ‹€. TypeScriptμ—λŠ” pollyfill이 ν¬ν•¨λ˜μ–΄ μžˆμ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ Mozillaμ—λŠ” pollyfill 이 μžˆμŠ΅λ‹ˆλ‹€.

믹슀 인 νŒ¨ν„΄ 타이핑에 λŒ€ν•΄ λ¬»λŠ”λ‹€λ©΄ 2.0 λ‘œλ“œλ§΅μ—μ„œ 항상 가지고 μžˆμ—ˆλ˜ κ²ƒμž…λ‹ˆλ‹€.

감사. es3 / es5 / es6둜 트랜슀 νŒŒμΌν•˜λŠ” TypeScriptμ—μ„œ Object.assign(...) λ₯Ό μž‘μ„±ν•˜λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€. λ”°λΌμ„œ 2.0의 λ‘œλ“œλ§΅μ— μžˆμŠ΅λ‹ˆλ‹€.

: +1 :

@unional λ­”κ°€ μ˜€ν•΄ν–ˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λ‚˜λŠ” λ‹Ήμ‹ μ˜ 결둠이 μ˜³μ§€ μ•Šλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

ES6λŠ” μ–΄μ¨Œλ“  Object.assign λ₯Ό μ§€μ›ν•˜λ―€λ‘œ λŒ€μƒμ΄ ES6이면 μ–΄μ¨Œλ“  TypeScript둜 μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ es5 μ΄ν•˜λ‘œ 트랜슀 νŒŒμΌν•˜λŠ” 경우 es5μ—λŠ” Object.assign 이 μ—†κΈ° λ•Œλ¬Έμ— μ—¬μ „νžˆ polyfill이 ν•„μš”ν•©λ‹ˆλ‹€.

λΉ λ₯Έ ν•΄κ²° λ°©λ²•μœΌλ‘œμ΄ polyfillκ³Ό μž…λ ₯을 κ³ λ €ν•˜μ‹­μ‹œμ˜€.

interface ObjectConstructor {
    assign(target: any, ...sources: any[]): any;
}

if (typeof Object.assign != 'function') {
  (function () {
    Object.assign = function (target) {
      'use strict';
      if (target === undefined || target === null) {
        throw new TypeError('Cannot convert undefined or null to object');
      }

      var output = Object(target);
      for (var index = 1; index < arguments.length; index++) {
        var source = arguments[index];
        if (source !== undefined && source !== null) {
          for (var nextKey in source) {
            if (source.hasOwnProperty(nextKey)) {
              output[nextKey] = source[nextKey];
            }
          }
        }
      }
      return output;
    };
  })();
}

이 문제λ₯Ό μ°Ύμ•„ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€. κ½€ 였래 μ „μ΄μ—ˆμŠ΅λ‹ˆλ‹€. :) 예, 이제 es5에 λŒ€ν•œ polyfill이 ν•„μš”ν•˜λ‹€λŠ” 것을 μ΄ν•΄ν•©λ‹ˆλ‹€.

λ‹€μ‹œ ν•œ 번 κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€!

target이 es5둜 μ„€μ •λ˜λ©΄μ΄ polyfill을 μ»΄νŒŒμΌν• κΉŒμš”? 즉, 컴파일 λŒ€μƒμ΄ es5둜 μ„€μ •λ˜μ–΄ μžˆμœΌλ―€λ‘œ es5 ν™˜κ²½μ—μ„œ μž‘λ™ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

target이 es5둜 μ„€μ •λ˜λ©΄μ΄ polyfill을 μ»΄νŒŒμΌν• κΉŒμš”?

λ„€, ν¬λ‹ˆ ν•„λ‘œ : μž₯λ―Έ :: 말 :

이해가 μ•ˆ λΌμ„œ λ―Έμ•ˆ ν•΄μš”. ES6λŠ” Object.assign ν•˜λ―€λ‘œ Babel은 ES5 λŒ€μƒμ„μœ„ν•œ 폴리 ν•„λ‘œ λ³€ν™˜ν•©λ‹ˆλ‹€. TypeScriptκ°€ λ‹€λ₯Έ ES6 κΈ°λŠ₯κ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ λ™μΌν•œ κΈ°λŠ₯을 μˆ˜ν–‰ν•˜μ§€ μ•ŠλŠ” μ΄μœ κ°€ ν—·κ°ˆλ¦½λ‹ˆλ‹€.

@prashaantt TypeScriptλŠ” Object.assign λ˜λŠ” μƒˆλ‘œμš΄ ν‘œμ€€μ— μ˜ν•΄ μΆ”κ°€ 된 기타 κΈ°λ³Έ / λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λ €λ©΄ λ‹€μŒ 쀑 ν•˜λ‚˜λ₯Ό μˆ˜ν–‰ν•΄μ•Όν•©λ‹ˆλ‹€.

  • ν•΄λ‹Ή μž…λ ₯ κ³Ό ν•¨κ»˜ polyfill 라이브러리 (예 : core-js ) μ‚¬μš©
  • κΈ°λŠ₯이 μΆ”κ°€λ˜μ—ˆμ„ λ•Œ ν‘œμ€€μ„ νƒ€κ²ŸνŒ…ν•©λ‹ˆλ‹€ (예 : "target": "es6" μ—μ„œ tsconfig.json ).

@ devoto13 κ°μ‚¬ν•©λ‹ˆλ‹€, core-js 잘 μž‘λ™ν•©λ‹ˆλ‹€.

방금 어리석은 μ§ˆλ¬Έμ΄μžˆμ—ˆμŠ΅λ‹ˆλ‹€. npm install ing 및 typings install ing core-js 후에 폴리 ν•„ λ©”μ„œλ“œμ— λŒ€ν•œ IntelliSenseλ₯Ό μ–»κΈ° μ‹œμž‘ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ—¬μ „νžˆ μ‚¬μš©μ€‘μΈ λͺ¨λ“  λͺ¨λ“ˆμ—μ„œ ν•΄λ‹Ή λ©”μ„œλ“œλ₯Ό μ‹€μ œλ‘œ κ°€μ Έμ™€μ•Όν•©λ‹ˆλ‹€. 그렇지 μ•ŠμœΌλ©΄ 컴파일 된 μ½”λ“œμ— 폴리 필이 ν¬ν•¨λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

@prashaantt core-js/shim 이 (κ°€) ν•„μš”ν•œ 경우 Object.assign λŠ” κ·Έ μ‹œμ λΆ€ν„° μ „ μ„Έκ³„μ μœΌλ‘œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 메인 λͺ¨λ“ˆ / μ—”νŠΈλ¦¬ 포인트의 맨 μœ„μ— import 'core-js/shim'; λ₯Ό λ„£λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

κ°μ‚¬ν•©λ‹ˆλ‹€ @jesseschalken. 후속 쑰치둜 shim 전체λ₯Ό κ°€μ Έ 였면 λ²ˆλ“€μ΄ 뢀풀렀지지 μ•Šλ‚˜μš”? μ•„λ‹ˆλ©΄ tsc λ˜λŠ” ts-loader κ°€ λ‚΄ μ½”λ“œμ—μ„œ μ‹€μ œλ‘œ μ‚¬μš©λ˜λŠ” κ²ƒλ§Œ 선택할 μˆ˜μžˆμ„λ§ŒνΌ λ˜‘λ˜‘ν• κΉŒμš”?

@prashaantt λŒ€μƒ λΈŒλΌμš°μ €μ— 따라 λ‹€λ¦…λ‹ˆλ‹€. 당신은 이미 Object.assign κ°€ 당신이 λͺ©ν‘œλ‘œν•˜λŠ” λΈŒλΌμš°μ €μ—μ„œ μ§€μ›λ˜μ§€ μ•ŠλŠ”λ‹€λŠ” 것을 μ•Œκ³  μžˆμŠ΅λ‹ˆλ‹€. κ°€μž₯ κ΄‘λ²”μœ„ν•œ λΈŒλΌμš°μ € 지원을 μ›ν•˜λ©΄ λ²ˆλ“€μ— 전체 shim이 ν•„μš”ν•©λ‹ˆλ‹€.

Object.assign λŒ€ν•œ polyfill 만 μ›ν•˜λŠ” 경우 import 'core-js/modules/es6.object.assign'; ν•  수 있으며 ν•„μš”ν•œ ν•­λͺ©μ„ μΆ”κ°€ ν•  수 μžˆμŠ΅λ‹ˆλ‹€ (λͺ©λ‘μ€ core-js의 shim.js μ°Έμ‘°). λ¬Έμ„œ). Webpack은 ν•„μˆ˜ κ·Έλž˜ν”„λ₯Ό λ”°λ₯΄κ³  ν•„μš”ν•œ λͺ¨λ“ˆ 만 ν¬ν•¨ν•©λ‹ˆλ‹€.

이미 Babel을 μ‚¬μš©ν•˜κ³  μžˆλ‹€λ©΄ core-jsλ₯Ό 직접 μ‚¬μš©ν•˜λŠ” λŒ€μ‹  import 'babel-polyfill'; λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. μ—¬κΈ°μ—λŠ” generators / async-await에 λŒ€ν•œ core-js/shim 뿐만 μ•„λ‹ˆλΌ regenerator-runtime λ©λ‹ˆλ‹€.

νŒμ„ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€. μ§€κΈˆ λ‹Ήμž₯ μ™„μ „ν•œ λ°œμ „κΈ° 지원을 제곡 ν•΄μ•Όν•©λ‹ˆλ‹€. 말 κ·ΈλŒ€λ‘œ 2.0에 λŒ€ν•œ λ§ˆμ§€λ§‰ μž₯μ• λ¬Όμž…λ‹ˆλ‹€ !

이해가 μ•ˆ λΌμ„œ λ―Έμ•ˆ ν•΄μš”. ES6λŠ” Object.assign을 μ§€μ›ν•˜λ―€λ‘œ Babel은 ES5 λŒ€μƒμ„μœ„ν•œ 폴리 ν•„λ‘œ 트랜슀 νŒŒμΌν•©λ‹ˆλ‹€. TypeScriptκ°€ λ‹€λ₯Έ ES6 κΈ°λŠ₯κ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ λ™μΌν•œ κΈ°λŠ₯을 μˆ˜ν–‰ν•˜μ§€ μ•ŠλŠ” μ΄μœ κ°€ ν—·κ°ˆλ¦½λ‹ˆλ‹€.

@prashaantt Babel _transpiles_ Object.assign λΌκ³ ν•˜λ©΄ 무슨 λœ»μž…λ‹ˆκΉŒ? 그것은 단지 κΈ°λŠ₯μž…λ‹ˆλ‹€. polyfill, ponyfill을 μΆ”κ°€ν•˜κ±°λ‚˜ 직접 μž‘μ„±ν•  수 있으며 ES 3, 5.1, 6 λ“± λͺ¨λ“  ν™˜κ²½μ—μ„œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

@aluanhaddad babelμ΄ν•˜λŠ” 일에 λŒ€ν•œ λ‚˜μ˜ μ΄ν•΄λŠ” es5λ₯Ό λŒ€μƒμœΌλ‘œ μ§€μ •ν•˜κ³  Object.assign λ₯Ό μ‚¬μš©ν•˜λ©΄ Object.assign λŒ€ν•œ polyfill이 μžλ™μœΌλ‘œ ν¬ν•¨λ˜κ³  μ‚¬μš©ν•˜μ§€ μ•ŠμœΌλ©΄ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” κ²ƒμž…λ‹ˆλ‹€. typescriptκ°€ "es2015의 μƒμœ„ 집합"이라고 μ£Όμž₯ν•œ 것과 λ™μΌν•œ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λ©΄ 쒋을 κ²ƒμž…λ‹ˆλ‹€. μ΄λŠ” 이전 λŒ€μƒμœΌλ‘œ 트랜슀 νŒŒμΌν•˜λŠ” κΈ°λŠ₯을 μ œκ³΅ν•˜μ§€ μ•ŠλŠ” κ²½μš°μ—λŠ” 사싀이 μ•„λ‹™λ‹ˆλ‹€. (λ‚˜λŠ” 틀릴 수 μžˆμŠ΅λ‹ˆλ‹€)

@ devoto13 λŒ€μƒμ΄ es5이면 μ΅œμ†Œν•œ Object.assign이 es5μ—μ„œ μ§€μ›λ˜μ§€ μ•ŠλŠ”λ‹€λŠ” κ²½κ³ λ₯Ό ν‘œμ‹œν•΄μ•Όν•©λ‹ˆλ‹€. μ™„μ „νžˆ μœ νš¨ν•˜κ³  ν”„λ‘œκ·Έλž˜λ¨Έμ—κ²Œ μž„μ˜μ˜ 폴리 필이 ν•„μš”ν•˜λ‹€κ³  λ§ν•˜μ§€ μ•ŠλŠ” 것은 μ˜λ―Έκ°€ μ—†μŠ΅λ‹ˆλ‹€.

@kyleholzinger 당신이 μ„€λͺ…ν•œ 것 (ES5λ₯Ό λŒ€μƒμœΌλ‘œ 함은 Object.assign을 μ‚¬μš©ν•  수 μ—†μŒμ„ 의미 함)은 이미 λ™μž‘μž…λ‹ˆλ‹€.

@kyleholzinger μ‹€μ œλ‘œ 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€. λ‹€μŒ 두 파일둜 폴더λ₯Ό μƒμ„±ν•˜λŠ” 경우 :

// test.ts
let t = Object.assign({}, {});
// tsconfig.json
{ "target": "es5" }

그런 λ‹€μŒ tsc μ‹€ν–‰ν•˜μ‹­μ‹œμ˜€. λ‹€μŒκ³Ό 같은 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

$ tsc
test.ts(1,16): error TS2339: Property 'assign' does not exist on type 'ObjectConstructor'.

ν”„λ‘œμ νŠΈμ—μ„œ 일뢀 polyfill에 λŒ€ν•œ μž…λ ₯을 포함 ν•  수 μžˆμ§€λ§Œ polyfill κ΅¬ν˜„μ„ ν¬ν•¨ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— μ‹€νŒ¨ν•©λ‹ˆλ‹€.

λ‚˜λŠ” 그것이 ν˜„μž¬μ˜ ν–‰λ™μ΄λΌλŠ” 것을 μ΄ν•΄ν•©λ‹ˆλ‹€. λ‚΄ μš”μ μ€ λŒ€μƒμ„ es5둜 μ§€μ •ν•˜λ©΄ typescriptκ°€ "μƒμ„±μžμ— μ—†μŠ΅λ‹ˆλ‹€"λ₯Ό λ„˜μ–΄μ„œ μ˜λ―ΈμžˆλŠ” 였λ₯˜λ₯Ό μ œκ³΅ν•˜λ©΄ 쒋을 κ²ƒμž…λ‹ˆλ‹€.

@kyleholzinger FWIW, TypeScript 2.1은 이제 ES6 (ES7?) 개체 νœ΄μ‹ / 확산을 μ§€μ›ν•˜λ―€λ‘œ 개인적으둜 더 이상 Object.assign λŒ€ν•΄ μ‹ κ²½ μ“Έ μ΄μœ κ°€ μ μŠ΅λ‹ˆλ‹€. λ„€μ΄ν‹°λΈŒ 생성기λ₯Ό μ‚¬μš©ν•˜λ©΄ λŒ€λΆ€λΆ„μ˜ ν”„λ‘œμ νŠΈμ—μ„œ 폴리 필이 ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μ‚¬μ‹€μž…λ‹ˆλ‹€. μ–Έμ–΄ κΈ°λŠ₯을 μ œμ™Έν•˜μ§€ μ•ŠλŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. Object.assign이 λΈŒλΌμš°μ € μ˜μ‘΄μ μ΄μ§€ μ•Šμ•˜κ³ , polyfill을 μ‚¬μš©ν•˜μ§€ μ•Šμ•˜λ‹€λ©΄ typescriptκ°€ κ²½κ³ ν–ˆλ‹€λ©΄ 정말 쒋을 κ²ƒμž…λ‹ˆλ‹€.

tsconfigκ°€ μ˜¬λ°”λ₯΄κ²Œ μ„€μ •λœ 경우 TypeScriptλŠ” μ²˜μŒμ— Object μ—μ„œ ν•΄λ‹Ή ν•¨μˆ˜ 이름을 μžλ™ μ™„μ„±ν•˜λŠ” μ˜΅μ…˜μ„ μ œκ³΅ν•˜μ§€ μ•ŠμŒμœΌλ‘œμ¨ <ES6μ—μ„œ μ‚¬μš©ν•  μˆ˜μ—†λŠ” assign 에 λŒ€ν•΄ κ²½κ³ ν•©λ‹ˆλ‹€. μ†μœΌλ‘œ μ—΄μ‹¬νžˆ 적어 보면 뢉은 λ¬Όκ²° λ¬΄λŠ¬κ°€ λ³΄μž…λ‹ˆλ‹€. 이λ₯Ό λ¬΄μ‹œν•˜λ©΄ tsc μ—μ„œ μœ„μ˜ 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 당신이 그것을 고의적으둜 λ¬΄μ‹œν•œλ‹€λ©΄, 당신은 λ‹Ήμ—°νžˆ λ‹Ήμ‹ μ˜ 운λͺ…을받을 자격이 μžˆμŠ΅λ‹ˆλ‹€. ;)

λ§žμ•„μš”, λ‚΄ μœ μΌν•œ μš”μ μ€ es2015 사양에 μžˆμœΌλ―€λ‘œ typescript에 μžˆμ–΄μ•Όν•©λ‹ˆλ‹€.)

es5 λ₯Ό νƒ€κ²ŸνŒ…ν•˜λŠ” λ™μ•ˆ λ…Έλ“œμ—μ„œ Object.assign 을 (λ₯Ό) μ–΄λ–»κ²Œ μ‚¬μš©ν•©λ‹ˆκΉŒ? 즉, μ½”λ“œλŠ” λΈŒλΌμš°μ €κ°€ μ•„λ‹Œ μ„œλ²„μ—μ„œ μ‹€ν–‰λ©λ‹ˆλ‹€. 폴리 필도 μ–΄λ–»κ²Œ μ‚¬μš©ν•˜λ‚˜μš”?

λΏ‘λΏ‘
μ΄λŠ” λ…Έλ“œμ˜ 버전에 따라 λ‹¬λΌμ§‘λ‹ˆλ‹€. 즉, λͺ¨λ“  폴리 ν•„ κ°€λŠ₯ κΈ°λŠ₯의 경우처럼 λŸ°νƒ€μž„μ— 따라 λ‹¬λΌμ§‘λ‹ˆλ‹€.

λŸ°νƒ€μž„μ΄ Object.assign μ§€μ›ν•˜λŠ”μ§€ ν…ŒμŠ€νŠΈν•˜λŠ” 방법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

$ Node 
> Object.assign({ to: 'world' }, { message: 'Hello there!' })
{ to: 'world', message: 'Hello there!' }

μœ„μ˜ μž‘ν’ˆμ€ λͺ¨λ‘ 당신이해야 ν•  경우 ISλŠ” 포함 "es2017.object" μ—μ„œ "compilerOptions"."lib" λ‹Ήμ‹ μ˜ tsconfig.json의 속성을.

μœ„μ˜ λ‚΄μš©μ΄ μ‹€νŒ¨ν•˜λ©΄ TypeScript둜 μž‘μ„±λœ 이와 같은 polyfill을 μΆ”κ°€ν•˜μ‹­μ‹œμ˜€.

// polyfill-object-assign.ts

if (typeof Object.assign !== 'function') {
  Object.assign = function (target, ...args) {

    if (!target) {
      throw TypeError('Cannot convert undefined or null to object');
    }
    for (const source of args) {
      if (source) {
        Object.keys(source).forEach(key => target[key] = source[key]);
      }
    }
    return target;
  };
}

그리고 κ°€μ Έ 였기

import './polyfill-object-assign';

λ˜ν•œ λŸ°νƒ€μž„ 지원 사둀와 λ™μΌν•˜κ²Œ tsconfig.json을 λ³€κ²½ν•©λ‹ˆλ‹€.

도움이 λ˜μ—ˆκΈ°λ₯Ό λ°”λžλ‹ˆλ‹€.

@aluanhaddad 톡찰λ ₯에 κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€. λ‚΄ λ…Έλ“œλŠ” μ‹€ν–‰ν•˜λ„λ‘ μš”μ²­ν•œ μ‹€ν—˜μ— 따라 Object.assign 을 μ§€μ›ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ "compilerOptions": { "lib": ["es2017.object"] } 을 μΆ”κ°€ ν•œ 후에도 μ—¬μ „νžˆ squiggles μ–»μŠ΅λ‹ˆλ‹€. κ·Έλƒ₯ λ¬΄μ‹œν•΄μ•Όν• κΉŒμš” μ•„λ‹ˆλ©΄ 사라지도둝 ν•  μˆ˜μžˆλŠ” 일이 μžˆμŠ΅λ‹ˆκΉŒ?

@aluanhaddad μ‹ κ²½ 쓰지 마. 이제 잘 μž‘λ™ν•©λ‹ˆλ‹€.

@aluanhaddad λ‚΄κ°€ μ΄μ „ν–ˆλ‹€ "compilerOptions": { "lib": ["es2017.object", "es6"] } λ‚˜λŠ” 점점 λ•Œ squiggles . es6 μ œκ±°ν•˜λ©΄ ν•΄κ²°λ˜λŠ” κ²ƒμ²˜λŸΌ λ³΄μ˜€μ§€λ§Œ gulp 슀크립트λ₯Ό λ‹€μ‹œ μ‹€ν–‰ν•˜λ©΄ κ°‘μžκΈ° μƒˆλ‘œμš΄ 였λ₯˜ μ„ΈνŠΈκ°€ μƒμ„±λ©λ‹ˆλ‹€.
λ‚΄ tsconfig.json :

{
    "compilerOptions": {
        "target": "es5",
        "module": "commonjs",
        "moduleResolution": "node",
        "lib": ["es2017.object"],
        "emitDecoratorMetadata": true,
        "experimentalDecorators": true,
        "sourceMap": true,
        "inlineSources": true,
        //"noImplicitAny": true,
        "declaration": true,
        "noFallthroughCasesInSwitch": true,
        // "noImplicitReturns": true,
        "removeComments": true,
        "stripInternal": true,
        "outDir": "dist"
    },
    "files": ["src/main.ts"],
    "include": [
        "src/**/*.ts"
    ],
    "exclude": [
        "node_modules"
    ]
}

λ‚΄ μƒˆλ‘œμš΄ 였λ₯˜ μƒ˜ν”Œ :

error TS2318: Cannot find global type 'Array'.
error TS2318: Cannot find global type 'Boolean'.
error TS2318: Cannot find global type 'Function'.
error TS2318: Cannot find global type 'IArguments'.
error TS2318: Cannot find global type 'Number'.
error TS2318: Cannot find global type 'RegExp'.
error TS2318: Cannot find global type 'String'.
error TS2339: Property 'bind' does not exist on type '(message?: any, ...optionalParams: {}) => void'.
error TS2339: Property 'bind' does not exist on type '(message?: any, ...optionalParams: {}) => void'.
error TS2322: Type '{}' is not assignable to type
error TS2304: Cannot find name 'Promise'.

κ·Έλ ‡λ‹€λ©΄ ꢌμž₯ 사항을 μ‚¬μš©ν•˜κ³  μ˜¬λ°”λ₯΄κ²Œ μ»΄νŒŒμΌν•˜κΈ° μœ„ν•΄ typescriptλ₯Ό μ–»λŠ” 방법이 μžˆμŠ΅λ‹ˆκΉŒ?

@johnbendi 예, ν™•μ‹€νžˆ.

μ‚¬μš© μš”μ²­μ˜ νŠΉμˆ˜μ„±μœΌλ‘œ 인해 νŠΉμ • ν•­λͺ© "es2017.object" μΆ”κ°€ ν•  것을 μ œμ•ˆν–ˆμŠ΅λ‹ˆλ‹€.
"lib": ["es6"] 이 더 이상 μ •ν™•ν•˜μ§€ μ•ŠμœΌλ©° "lib": ["es2015"] μ΄μ–΄μ•Όν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.
"lib": ["es2015", es2017.object"] λ˜λŠ” "lib": ["es2017"] ν•΄λ³΄μ„Έμš”.

빠진 것은 "λ‚˜λŠ” es6 폴리 필이 있고 λ‹Ήμ‹ μ˜ λΉ„μ¦ˆλ‹ˆμŠ€ νƒ€μž… μŠ€ν¬λ¦½νŠΈκ°€ μ•„λ‹ˆλΌκ³  κ°€μ •ν•˜μž"라고 λ§ν•˜λŠ” κΉ”λ”ν•œ 방법이라고 μƒκ°ν•©λ‹ˆλ‹€. :).

target: "es6" λ₯Ό μ„€μ •ν•˜λ©΄ κ·Έλ ‡κ²Œ ν•  수 μžˆμ§€λ§Œ 폴리 ν•„ λΆˆκ°€λŠ₯ν•œ es6 κΈ°λŠ₯을 μ‚¬μš©ν•˜μ—¬ μ½”λ“œλ₯Ό 생성 ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

core-jsλ₯Ό λͺ…μ‹œ 적으둜 μš”κ΅¬ν•˜λ©΄ 본질적으둜 shim이 ν•„μš”ν•˜λ©° TSκ°€ λΆˆν‰ν•˜κΈ° λ•Œλ¬Έμ— shimmy 및 non-shimmy λΉŒλ“œλ₯Ό κ°€μ§ˆ 수 μ—†μŠ΅λ‹ˆλ‹€.

μΆ”κ°€ node_modules/typescript/lib/lib.es6.d.ts 에 files μ—μ„œ tsconfig.json κ·Έ μž‘μ—…μ„ μˆ˜ν–‰ν•˜μ§€λ§Œ ..은 ... λ„ˆλ¬΄ κΉ¨λ—ν•˜κ³  보이지 μ•ŠλŠ” (λ˜λŠ” κ·Έ λ‹¬μ„±μ˜ ν™•μ‹€ν•œ 방법을 λ†“μΉœ 거지?)

@himdel κ·Έλƒ₯ μ‚¬μš©

{
  "compilerOptions": {
    "lib": [
      "es2015"
    ]
  }
}

μ™„λ²½ν•˜κ²Œ μž‘λ™ν•©λ‹ˆλ‹€-λͺ‡ 달 λ™μ•ˆ ν•΄μ™”μŠ΅λ‹ˆλ‹€.

λ˜λŠ” μ›ν•˜λŠ” ν•˜μœ„ 집합 :

{
  "compilerOptions": {
    "lib": [
      "es2015.core",
      "es2016.array.include"
    ]
  }
}

λ‚˜λŠ” 아직도 μ΄κ²ƒμ„ν•˜λŠ” 방법을 μ•Œμ•„λ‚Ό 수 μ—†λ‹€. target: "es5" tscλŠ” 항상 Object.assign λ₯Ό polyfill에 λŒ€ν•œ 호좜둜 λ³€ν™˜ν•©λ‹ˆλ‹€. libsλ₯Ό 좔가해도 λ‚˜λ₯Ό μœ„ν•΄ 아무것도 λ³€κ²½λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

제 κ²½μš°μ—λŠ” ν™”μ‚΄ν‘œ ν•¨μˆ˜λ₯Ό 일반 ν•¨μˆ˜λ‘œ λ³€ν™˜ν•˜κ³  μ‹Άμ§€λ§Œ Object.assign 및 Array.includes 와 같은 정적 ν˜ΈμΆœμ€ κ·ΈλŒ€λ‘œ λ‘‘λ‹ˆλ‹€.

tscμ—λŠ” 정적 λ©”μ„œλ“œ Object , Array λ“±κ³Ό 같은 polyfill κΈ°λŠ₯이 μ•„λ‹Œ ꡬ문 κΈ°λŠ₯ 만 트랜슀 νŒŒμΌν•˜λ„λ‘ μ•Œλ¦¬λŠ” ν”Œλž˜κ·Έκ°€ μžˆμ–΄μ•Όν•©λ‹ˆλ‹€.

λ‚΄κ°€ λŒ€μƒμ΄μžˆμ„ λ•Œ : "es5"tscλŠ” 항상 Object.assign을 polyfill에 λŒ€ν•œ 호좜둜 λ³€ν™˜ν•©λ‹ˆλ‹€.

@danez TypeScriptλŠ” Object.assign ν˜ΈμΆœμ„ μˆ˜μ •ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. Babel을 톡해 μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” 것 κ°™μŠ΅λ‹ˆκΉŒ?

@RyanCavanaugh κ·Έλ ‡μŠ΅λ‹ˆλ‹€ . Babel은 ν”„λ‘œμ„ΈμŠ€μ— κ΄€μ—¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
κ·Έκ²ƒμ΄ν•˜λŠ” 일은 기본적으둜 이것을 λ³€ν˜•μ‹œν‚€λŠ” κ²ƒμž…λ‹ˆλ‹€.

var a = Object.assign({}, {});

μ΄κ²ƒμœΌλ‘œ

var __assign = (this && this.__assign) || Object.assign || function(t) {
    for (var s, i = 1, n = arguments.length; i < n; i++) {
        s = arguments[i];
        for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
            t[p] = s[p];
    }
    return t;
};
var a = _assign({}, {});

@danez μ‹€μ œ μž¬ν˜„μ„ κ²Œμ‹œ ν•  수 μžˆμŠ΅λ‹ˆκΉŒ? μ»΄νŒŒμΌλŸ¬κ°€ ν•΄λ‹Ή μ½”λ“œλ₯Ό λ‚΄ 보내지 μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

μ €μž₯μ†Œκ°€ μ—†μ§€λ§Œ 이것은 tsconfigμž…λ‹ˆλ‹€.

{
  "compilerOptions": {
    "noImplicitAny": true,
    "strictNullChecks": true,
    "module": "ES2015",
    "target": "es5",
    "outDir": "js/lib/es"
  },
  "include": [
    "js/**/*.ts",
  ],
  "exclude": [
    "**/__tests__/**/*.ts"
  ]
}

그런 λ‹€μŒ κ°„λ‹¨νžˆ tsc

@danez λ‚˜λŠ” 당신이 μ‹€μ œ μž¬ν˜„μ„ κ²Œμ‹œν•΄μ•Ό ν•  것이 λ‘λ ΅μŠ΅λ‹ˆλ‹€.

C:\Throwaway\oat>type a.ts
var a = Object.assign({}, {});

C:\Throwaway\oat>type tsconfig.json
{
  "compilerOptions": {
    "noImplicitAny": true,
    "strictNullChecks": true,
    "module": "ES2015",
    "target": "es5",
    "outDir": "js/lib/es"
  },
  "include": [
    "*.ts",
  ]
}
C:\Throwaway\oat>tsc
a.ts(1,16): error TS2339: Property 'assign' does not exist on type 'ObjectConstructor'.

C:\Throwaway\oat>type js\lib\es\a.js
var a = Object.assign({}, {});

@unional 이 μ œλŒ€λ‘œ μž‘λ™ ν•œλ‹€λŠ” μ μ—μ„œ. μ»΄νŒŒμΌλŸ¬μ—λŠ” ꡬ문 지원을 μ œκ³΅ν•˜κΈ°μœ„ν•œ λ„μš°λ―Έκ°€ μžˆμ§€λ§Œ μ „μ—­μ—μ„œ κΈ°λŠ₯을 _ever_ λ‹€μ‹œ μž‘μ„±ν•˜μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€. @danez κ·Έ λ„μš°λ―ΈλŠ” 타이프 라이터 μ½”λ“œμ— μ˜ν•΄ μ§€κΈˆκΉŒμ§€ μ•‘μ„ΈμŠ€ ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

const foo = { foo: 'bar' };
const bar = { ...foo };

λ‹€μŒμ„ λ°©μΆœν•©λ‹ˆλ‹€.

var __assign = (this && this.__assign) || Object.assign || function(t) {
    for (var s, i = 1, n = arguments.length; i < n; i++) {
        s = arguments[i];
        for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
            t[p] = s[p];
    }
    return t;
};
var foo = { foo: 'bar' };
var bar = __assign({}, foo);

Object.assign() κ°€ __assign 재 μž‘μ„±λ˜λŠ” 예제λ₯Ό 제곡 ν•  수 μ—†λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. 객체 ν™•μ‚° ꡬ문 μ§€μ›μ—λ§Œ μ‚¬μš©λ©λ‹ˆλ‹€.

@kitsonk λ„€, μ €λŠ” 개체 확산을 μ‚¬μš©ν•˜κ³ μžˆμ—ˆμŠ΅λ‹ˆλ‹€. λ§žμŠ΅λ‹ˆλ‹€. 객체 확산이 λ‹¨μˆœνžˆ Object.assign λ³€ν™˜λ˜λ©΄ 쒋을 κ²ƒμž…λ‹ˆλ‹€.

@danez λŠ” Object.assign() λ₯Ό μ§€μ›ν•˜λŠ” λŒ€μƒμ„ λŒ€μƒμœΌλ‘œν•˜λŠ” κ²½μš°μž…λ‹ˆλ‹€ (예 : λŒ€μƒμ€ es2015 +).

예λ₯Ό λ“€λ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

const foo = { foo: 'bar' };
const bar = { ...foo };

λ‹€μŒμ„ 좜λ ₯ν•©λ‹ˆλ‹€.

const foo = { foo: 'bar' };
const bar = Object.assign({}, foo);

@kitsonk 예, μ•Œκ³  μžˆμ§€λ§Œ λͺ¨λ“  ES2017 + 전역이 core-js에 μ˜ν•΄ 폴리 ν•„λ˜λŠ” es5 _syntax_λ₯Ό λŒ€μƒμœΌλ‘œν•©λ‹ˆλ‹€. κ·Έλž˜μ„œ μ œκ°€ λ§ν•˜λŠ” 것이 쒋은 것은 es5 ꡬ문을 좜λ ₯ν•˜μ§€λ§Œ λͺ¨λ“  λ‚΄μž₯ κΈ°λŠ₯을 μ‚¬μš©ν•  수 μžˆλ‹€κ³  κ°€μ •ν•˜λŠ” λͺ¨λ“œμž…λ‹ˆλ‹€. babel이 useBuiltins μ˜΅μ…˜μœΌλ‘œν•˜λŠ” 것과 μœ μ‚¬ν•©λ‹ˆλ‹€ : https://github.com/babel/babel/tree/master/packages/babel-plugin-transform-react-jsx#usebuiltins

일반적으둜 μš°λ¦¬λŠ” "ν˜Όν•© 된"λŸ°νƒ€μž„ λŒ€μƒμ— λŒ€ν•œ νŠΉλ³„ν•œ 지원을 μ œκ³΅ν•˜κΈ° μœ„ν•΄ λ…Έλ ₯ν•˜μ§€ μ•Šμ§€λ§Œ μ‚¬μš©ν•  μˆ˜μžˆλŠ” λ‹€λ₯Έ μ˜΅μ…˜μ΄ μžˆμŠ΅λ‹ˆλ‹€.

__assign λ₯Ό μ „μ—­ λ²”μœ„μ— μ‚½μž…ν•˜κ³  (예 : __extends ) --noEmitHelpers μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

예, μ•Œμ§€λ§Œ es5 _syntax_λ₯Ό νƒ€κ²ŸνŒ…ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” 이것이 Object.assign 와 같은 κΈ°λŠ₯을 shimmingν•˜μ§€ μ•ŠλŠ” μ£Όμš” 문제라고 μƒκ°ν•©λ‹ˆλ‹€. μ–΄λ–€ 식 μœΌλ‘œλ“  μž…μž₯을 μ·¨ν•΄μ•Όν•©λ‹ˆλ‹€. μŠ€ν”„λ ˆλ“œλ₯Ό μ‚¬μš©ν•  λ•ŒλŠ” μ‚¬μš©λŸ‰μ„ __assign λ°”κΏ€ 수 μ—†μ§€λ§Œ 직접 호좜 ν•  λ•ŒλŠ” μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€. 지μ˜₯처럼 ν˜Όλž€ μŠ€λŸ½μŠ΅λ‹ˆλ‹€.

μŠ€ν”„λ ˆλ“œλ₯Ό μ‚¬μš©ν•  λ•Œ μ‚¬μš©λ²•μ„ __assign으둜 λ°”κΏ€ μˆ˜λŠ” μ—†μ§€λ§Œ 직접 호좜 ν•  λ•Œκ°€ μ•„λ‹ˆλΌ 지μ˜₯처럼 ν˜Όλž€ μŠ€λŸ½μŠ΅λ‹ˆλ‹€.

λ‚œ 당신이 ν˜Όλž€ μŠ€λŸ½λ‹€κ³  λŠλΌλŠ” 것을 이해할 수 μžˆμ§€λ§Œ, 만트라λ₯Ό μœ μ§€ν•œλ‹€λ©΄ TypeScriptλŠ” _ κΈ°λŠ₯적 polyfills_이 μ•„λ‹Œ _syntatical rewrites_λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. TypeScriptλŠ” μž‘λ™ 방식이 μ™„μ „νžˆ 일관 적이며 μˆ˜ν–‰ν•˜λŠ” μž‘μ—…μ— λŒ€ν•΄ 의견이 있으며 99 %의 경우 μ΅œμ’… μ‚¬μš©μžμ—κ²Œ 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

@RyanCavanaughκ°€ λ§ν–ˆλ“―μ΄, --noEmitHelpers 및 λ‹€μŒκ³Ό 같은 κΈ€λ‘œλ²Œ 슀크립트λ₯Ό μ‚¬μš©ν•˜μ—¬ tslib κ³Ό ν•¨κ»˜ 폴리 ν•„ μ„ΈνŠΈλ₯Ό ν™œμš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

__assign = Object.assign;

κ·ΈλŸ¬λ‚˜ 그것은 μ‹€μ œλ‘œ "λ³΄λ„ˆμŠ€ λΌμš΄λ“œ"TypeScript이며 μ‹€μ œ μΈ‘μ • κ°€λŠ₯ν•œ μ„±λŠ₯ ν–₯상을 제곡 ν•  것이라고 μ£Όμž₯ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰