Typescript: λͺ¨λ“ˆ μ •μ˜κ°€ μ „μ—­ λ³€μˆ˜λ‘œ μ„ μ–Έλ˜λ„λ‘ ν—ˆμš©

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

React μœ ν˜• μ •μ˜ 파일이 μžˆμŠ΅λ‹ˆλ‹€ (μ™ΈλΆ€ λͺ¨λ“ˆμ„ μ‚¬μš©ν•˜μ—¬ μ„ μ–Έ 됨). λ‚΄ μ†ŒμŠ€ νŒŒμΌμ—μ„œ λ‚˜λŠ” 일반적으둜 λ‹€μŒμ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.

import * as R from "react"

그런 λ‹€μŒ κ°•λ ₯ν•œ ν˜•μ‹μœΌλ‘œ R.createElement(... 등을 즐겁게 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” 심지어 ν•  μˆ˜μžˆλ‹€ :

let _r = R;
_r.createElement(...

λ‚΄κ°€ μ›ν•˜λŠ” 것은 λͺ¨λ“  νŒŒμΌμ—μ„œ R을 κ°€μ Έ μ˜€μ§€ μ•Šκ³  λŒ€μ‹  μ „μ—­ μ„ μ–ΈμœΌλ‘œ μ‚¬μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€ (예, λͺ‡ 가지 λ³€μˆ˜λ‘œ μ „μ—­ λ„€μž„ 슀페이슀λ₯Ό μ˜€μ—Όμ‹œν‚¬ κ²ƒμž…λ‹ˆλ‹€). .d.ts μ—μ„œ μ‹œλ„ν–ˆμŠ΅λ‹ˆλ‹€.

import * as React from "react";
declare var R : React;

κ·Έλž˜λ„ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. "React 이름을 찾을 수 μ—†μŠ΅λ‹ˆλ‹€."λΌλŠ” λ©”μ‹œμ§€κ°€ ν‘œμ‹œλ©λ‹ˆλ‹€. κΈ°λ³Έ react.d.tsλ₯Ό μˆ˜μ •ν•˜μ§€ μ•Šκ³  전체 λͺ¨λ“ˆμ„ μ „μ—­μœΌλ‘œ λ‚΄λ³΄λ‚΄λŠ” 또 λ‹€λ₯Έ 방법이 μžˆμŠ΅λ‹ˆκΉŒ?

Question

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

μ•ˆλ…•ν•˜μ„Έμš” @Evertt μ‹€μ œλ‘œμ΄ 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€. μ²˜μŒμ—λŠ” μ†ŒμŠ€ μ½”λ“œκ°€ ES6 λͺ¨λ“ˆ ꡬ문을 μ‚¬μš©ν•˜μ§€ μ•Šμ•˜μ§€λ§Œ 일뢀 νŒŒμΌμ„ ν•΄λ‹Ή ꡬ문으둜 λ¦¬νŒ©ν† λ§ν•˜λ©΄ λ™μΌν•œ 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. λͺ‡ 가지 쑰사λ₯Όν–ˆκ³  이제 μ €μ—κ²Œ 도움이 된 것은 두 번째 파일 globals.d.ts λ§Œλ“€κ³ μ΄λ₯Ό 타이핑 폴더에 넣을 λ•Œμž…λ‹ˆλ‹€.

import * as _R from 'ramda';
import * as _mobx from 'mobx';

declare global {
  const R: typeof _R;
  const mobx: typeof _mobx;
}

사싀이 νŒŒμΌλ§ŒμœΌλ‘œλŠ” 타이프 슀크립트 컴파일러λ₯Ό "만쑱"ν•˜λŠ” κ²ƒμ²˜λŸΌ λ³΄μ΄λ―€λ‘œ 이둠상 이전에 μ–ΈκΈ‰ ν•œ λ‹€λ₯Έ νŒŒμΌμ€ ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λ‚΄ νŠΉλ³„ν•œ 경우 (WebStorm을 μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€) globals.d.ts 파일 만 있으면 IDEκ°€ κ³„μ†ν•΄μ„œ λͺ¨λ“ˆμ„ κ°€μ Έ μ˜€λ„λ‘ ν•‘ν•˜κ³  ν•΄λ‹Ή 전역에 λŒ€ν•œ μ™„λ£Œκ°€ λΆˆμ™„μ „ν–ˆμŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ λ‚˜λŠ” 기본적으둜 typescript와 IDEλ₯Ό λ§Œμ‘±μ‹œν‚€λŠ” typings 디렉토리에 두 νŒŒμΌμ„ λͺ¨λ‘ λ³΄κ΄€ν–ˆμŠ΅λ‹ˆλ‹€. λ³„λ‘œ μ’‹μ§€λŠ” μ•Šμ§€λ§Œ 일반적으둜 μ‚¬μš©ν•˜λŠ” λͺ‡ 가지 전역에 λŒ€ν•΄μ„œλŠ” ν•΄λ‹Ή νŒŒμΌμ„ μœ μ§€ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

이것은 λ‚΄ tsconfig.json μž…λ‹ˆλ‹€.

{
  "compilerOptions": {
    "target": "ES5",
    "module": "amd",
    "moduleResolution": "node",
    "experimentalDecorators": true,
    "lib": [
      "ES6",
      "DOM",
      "ScriptHost"
    ],
    "sourceMap": true,
    "strictNullChecks": true
  },
  "include": [
    "types/**/*",
    "src/**/*"
  ]
}

λ²ˆλ“€λ‘œ webpackμ΄λ‚˜ λ‹€λ₯Έ 것을 μ‚¬μš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. κ°œλ³„ νŒŒμΌμ„ 트랜슀 νŒŒμΌν•˜κ³  https://github.com/SAP/openui5 λͺ¨λ“ˆ μ‹œμŠ€ν…œ (AMD와 μœ μ‚¬)을 ν†΅ν•΄λ‘œλ“œν•˜κ³  ν”„λ‘œλ•μ…˜ 용으둜 만 λ²ˆλ“€λ‘œ μ œκ³΅ν•©λ‹ˆλ‹€.

Typescript 버전 : 2.2.1

λ„μ›€μ΄λ˜κΈ°λ₯Ό λ°”λžλ‹ˆλ‹€.

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

import 선언을 μ†ŒμŠ€ νŒŒμΌμ— μΆ”κ°€ν•˜λŠ” μˆœκ°„ μ™ΈλΆ€ λͺ¨λ“ˆλ‘œ κ°„μ£Όλ˜κΈ° λ•Œλ¬Έμ—μ΄ μž‘μ—…μ„ μˆ˜ν–‰ ν•  수 μ—†μŠ΅λ‹ˆλ‹€. 전역을 μ‚¬μš©ν•˜λŠ” React μ •μ˜ νŒŒμΌμ„ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” μ΄μœ λŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ?

https://github.com/borisyankov/DefinitelyTyped/blob/master/react/react-global.d.ts

이것이 문제λ₯Ό ν•΄κ²°ν•  것 κ°™μŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” μ‹€μ œλ‘œ react-global.d.ts 도 μ‹œλ„ν–ˆλŠ”λ°, λΆ„λͺ…νžˆ μ „μ—­ 곡간에 React λ₯Ό λ„£μ—ˆμ§€λ§Œ μ–΄λ–»κ²Œ μ „μ—­ 적으둜 이름을 λ°”κΎΈκ³  Typescript에 μ•Œλ¦΄ 수 μžˆμ„κΉŒμš”?

declare var _r = React;  // error Cannot find name 'React';

λ‚΄ μ‹€μ œ μ‚¬μš© μ‚¬λ‘€λŠ” μœ ν‹Έλ¦¬ν‹° / 곡톡 μœ ν˜• λͺ¨λ“ˆμ„ μ „μ—­ κ³΅κ°„μœΌλ‘œ λŒμ–΄ 올릴 수 μžˆμœΌλ―€λ‘œμ΄λ₯Ό μ–»κΈ° μœ„ν•΄ λ§Žμ€ μƒλŒ€ 경둜 κ°€μ Έ 였기λ₯Ό μ‚¬μš©ν•  ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€. Javascriptμ—μ„œμ΄ μž‘μ—…μ„ μˆ˜ν–‰ ν•  수 μžˆμ§€λ§Œ Typescript μ»΄νŒŒμΌλŸ¬κ°€ λ‚΄κ°€ μˆ˜ν–‰ν–ˆμŒμ„ μ•Œλ¦¬λŠ” 방법에 λŒ€ν•΄ κ³ μ‹¬ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

@ahejlsberg- λ‚˜λŠ” 당신이 엣지 μΌ€μ΄μŠ€μ— λŒ€ν•œ λ‚΄ 생각을

예λ₯Ό λ“€μ–΄ r.d.ts μ„ μ–Έ νŒŒμΌμ„ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

/// <reference path="react-global.d.ts"/>
declare var R: typeof React;

λͺ¨λ“  κ³³μ—μ„œ ν•΄λ‹Ή νŒŒμΌμ„ μ°Έμ‘°ν•©λ‹ˆλ‹€. λ˜λŠ” 더 λ‚˜μ€ :

/// <reference path="react-global.d.ts"/>
import R = React;

그러면 React의 μœ ν˜•μ„ R.xxx둜 μ°Έμ‘° ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” 전에 typeof 의 μ‚¬μš©μ„ λ³Έ 적이 μ—†λ‹€-κ½€ 멋지닀. 이것은 .d.ts μ—μ„œ 이미 μ •μ˜ 된 λͺ¨λ“ˆμ— λŒ€ν•΄ ν›Œλ₯­ν•˜κ²Œ μž‘λ™ν•˜μ§€λ§Œ Typescript에 μ •μ˜ 된 μ™ΈλΆ€ λͺ¨λ“ˆμ„ μ „μ—­ κ³΅κ°„μœΌλ‘œ λŒμ–΄ 올렀 Typescript에 λŒ€ν•΄ μ•Œ μˆ˜μžˆλŠ” 방법은 아직 보이지 μ•ŠμŠ΅λ‹ˆλ‹€. μ•ˆν‹° νŒ¨ν„΄μ΄λΌμ„œ κ·Έλƒ₯ λ„˜μ–΄ κ°€μ•Ό ν• κΉŒ ...

μ™ΈλΆ€ λͺ¨λ“ˆμ„ μ§€μ›ν•˜κΈ° μœ„ν•΄ typeof λ₯Ό ν™•μž₯ ν•΄ λ‹¬λΌλŠ” λͺ‡ 가지 μš”μ²­ (예 : # 2357)이 μžˆμ—ˆμ§€λ§Œ μ§€κΈˆκΉŒμ§€μ΄ κΈ°λŠ₯에 λŒ€ν•œ μˆ˜μš”λŠ” λ§Žμ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

일반적으둜 ν”„λ‘œκ·Έλž¨μ€ μ™ΈλΆ€ λͺ¨λ“ˆμ—†μ΄ μž‘μ„±λ˜κ±°λ‚˜ μ™ΈλΆ€ λͺ¨λ“ˆλ‘œλ§Œ μž‘μ„±λ©λ‹ˆλ‹€. AMD λΈŒλΌμš°μ € μ•±μ˜ λΆ€νŠΈ 슀트랩 λΆ€λΆ„ μ™Έμ—λŠ” ν˜Όν•© λͺ¨λΈμ΄ κ°€λŠ₯ν•œ μ‹€ν–‰ ν™˜κ²½μ΄ μ‹€μ œλ‘œ μ—†μŠ΅λ‹ˆλ‹€. λ„€, λŒ€λΆ€λΆ„μ€ μ•ˆν‹° νŒ¨ν„΄μž…λ‹ˆλ‹€.

μœ λ¨ΈλŸ¬μŠ€ν•˜κ²Œ μ‹œκ°„μ„ λ‚΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€! μ €λŠ” (곧 μΆœμ‹œ 될 Angular2 및 Aurelia ν”„λ ˆμž„ μ›Œν¬λ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄) μ™ΈλΆ€ λͺ¨λ“ˆμ„ νƒμƒ‰ν•˜κΈ° μ‹œμž‘ν–ˆμŠ΅λ‹ˆλ‹€. # 17, # 2338 및 # 2839와 같은 λ¬Έμ œλŠ” κ²°κ΅­ λ‚΄κ°€ μ°Ύκ³ μžˆλŠ” 것보닀 더 λ§Žμ€ 것 κ°™μŠ΅λ‹ˆλ‹€. ν˜„μž¬ ν”„λ‘œμ νŠΈμ— λŒ€ν•΄ 더 깊이 파고 λ“€λ©΄μ„œ 더 λͺ…ν™•ν•œ ν”Όλ“œλ°±μ„ 얻을 수 있기λ₯Ό λ°”λžλ‹ˆλ‹€.

μ—¬μ „νžˆ ν•  수 μ—†μŠ΅λ‹ˆκΉŒ? μ €λŠ” VueJS와 ν•¨κ»˜ TypeScriptλ₯Ό μ‚¬μš©ν•˜λ €κ³ ν•˜λŠ”λ° λͺ‡ 가지λ₯Ό μ „μ—­ λ„€μž„ 슀페이슀둜 κ°€μ Έ μ™€μ„œ λͺ¨λ“  ꡬ성 μš”μ†Œκ°€ μ΄λŸ¬ν•œ 것듀을 κ°€μ Έμ˜¬ ν•„μš”μ—†μ΄ μ‚¬μš©ν•  수 μžˆλ‹€λ©΄ λŒ€λ‹¨νžˆ κ°μ‚¬ν•˜κ² μŠ΅λ‹ˆλ‹€. 이 μž‘μ—…μ„ μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ μ–΄λ–€ μ§„μ „μ΄λ‚˜ 해킹이 μžˆμ—ˆμŠ΅λ‹ˆκΉŒ?

μ—λ²„νŠΈ

λ‚˜λŠ” λΆ„λͺ…νžˆ typescript 2.xxμ—μ„œ μž‘λ™ν•˜λŠ” 방법을 μ°Ύμ•˜μŠ΅λ‹ˆλ‹€. 제 κ²½μš°μ—λŠ” 라이브러리 ramdaλ₯Ό μ „μ—­ R 둜 λ…ΈμΆœν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

  1. npm install ramda @types/ramda
  2. typings/ramda.d.ts 파일 생성
  3. μƒˆλ‘œ 생성 된 typings 폴더λ₯Ό .tsconfig.json의 포함에 μΆ”κ°€ν•©λ‹ˆλ‹€.
"include": [
    "typings/**/*",
     ...
]
  1. typings/ramda.d.ts λ§ˆλ²• μΆ”κ°€ :
import * as _R from 'ramda';

export as namespace R;
export = _R; 

이제 λ‚΄ ν”„λ‘œμ νŠΈμ˜ λͺ¨λ“  ts νŒŒμΌμ€ λ‚΄κ°€ 더 이상 κ°€μ Έ 였기λ₯Ό μˆ˜ν–‰ν•˜μ§€ μ•Šκ³  ν•΄λ‹Ή νŒŒμΌμ—μ„œ μœ ν˜•μ΄ μ§€μ •λœ μ „μ—­ R κ°€ μžˆλ‹€κ³  κ°€μ •ν•©λ‹ˆλ‹€.

λ‚΄ types/vue.d.ts μ—μ„œ λ‹€μŒ μ½”λ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ κ·Έλ ‡κ²Œν•˜λ €κ³  ν•  λ•Œ @geekflyer :

import * as V from 'vue'

export as namespace Vue
export = V

μ „μ—­ Vue μ–΄λ”˜κ°€μ—μ„œ μ‚¬μš©ν•˜λ €κ³  ν•  λ•Œλ§ˆλ‹€ λ‹€μŒ 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

error TS2686: 'Vue' refers to a UMD global, but the current file is a module. Consider adding an import instead.

μ–΄λŠ μ‹œμ μ—μ„œ κ·Έ 였λ₯˜κ°€ λ°œμƒ ν–ˆμŠ΅λ‹ˆκΉŒ? κ·Έλ ‡λ‹€λ©΄ μ–΄λ–»κ²Œ ν–ˆμŠ΅λ‹ˆκΉŒ?

νŽΈμ§‘ν•˜λ‹€

ν•΄λ‹Ή 였λ₯˜κ°€ λ°œμƒν•˜μ§€ μ•Šκ³  μ™œ κ·Έ 였λ₯˜κ°€ λ°œμƒν•˜λŠ”μ§€ 잘 λͺ¨λ₯΄κ² λ‹€λ©΄ 전체 tsconfig.jsonκ³Ό μ›ΉνŒ© ꡬ성을 ν‘œμ‹œν•΄ μ£Όμ‹œκ² μŠ΅λ‹ˆκΉŒ?

μ•ˆλ…•ν•˜μ„Έμš” @Evertt μ‹€μ œλ‘œμ΄ 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€. μ²˜μŒμ—λŠ” μ†ŒμŠ€ μ½”λ“œκ°€ ES6 λͺ¨λ“ˆ ꡬ문을 μ‚¬μš©ν•˜μ§€ μ•Šμ•˜μ§€λ§Œ 일뢀 νŒŒμΌμ„ ν•΄λ‹Ή ꡬ문으둜 λ¦¬νŒ©ν† λ§ν•˜λ©΄ λ™μΌν•œ 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. λͺ‡ 가지 쑰사λ₯Όν–ˆκ³  이제 μ €μ—κ²Œ 도움이 된 것은 두 번째 파일 globals.d.ts λ§Œλ“€κ³ μ΄λ₯Ό 타이핑 폴더에 넣을 λ•Œμž…λ‹ˆλ‹€.

import * as _R from 'ramda';
import * as _mobx from 'mobx';

declare global {
  const R: typeof _R;
  const mobx: typeof _mobx;
}

사싀이 νŒŒμΌλ§ŒμœΌλ‘œλŠ” 타이프 슀크립트 컴파일러λ₯Ό "만쑱"ν•˜λŠ” κ²ƒμ²˜λŸΌ λ³΄μ΄λ―€λ‘œ 이둠상 이전에 μ–ΈκΈ‰ ν•œ λ‹€λ₯Έ νŒŒμΌμ€ ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λ‚΄ νŠΉλ³„ν•œ 경우 (WebStorm을 μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€) globals.d.ts 파일 만 있으면 IDEκ°€ κ³„μ†ν•΄μ„œ λͺ¨λ“ˆμ„ κ°€μ Έ μ˜€λ„λ‘ ν•‘ν•˜κ³  ν•΄λ‹Ή 전역에 λŒ€ν•œ μ™„λ£Œκ°€ λΆˆμ™„μ „ν–ˆμŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ λ‚˜λŠ” 기본적으둜 typescript와 IDEλ₯Ό λ§Œμ‘±μ‹œν‚€λŠ” typings 디렉토리에 두 νŒŒμΌμ„ λͺ¨λ‘ λ³΄κ΄€ν–ˆμŠ΅λ‹ˆλ‹€. λ³„λ‘œ μ’‹μ§€λŠ” μ•Šμ§€λ§Œ 일반적으둜 μ‚¬μš©ν•˜λŠ” λͺ‡ 가지 전역에 λŒ€ν•΄μ„œλŠ” ν•΄λ‹Ή νŒŒμΌμ„ μœ μ§€ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

이것은 λ‚΄ tsconfig.json μž…λ‹ˆλ‹€.

{
  "compilerOptions": {
    "target": "ES5",
    "module": "amd",
    "moduleResolution": "node",
    "experimentalDecorators": true,
    "lib": [
      "ES6",
      "DOM",
      "ScriptHost"
    ],
    "sourceMap": true,
    "strictNullChecks": true
  },
  "include": [
    "types/**/*",
    "src/**/*"
  ]
}

λ²ˆλ“€λ‘œ webpackμ΄λ‚˜ λ‹€λ₯Έ 것을 μ‚¬μš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. κ°œλ³„ νŒŒμΌμ„ 트랜슀 νŒŒμΌν•˜κ³  https://github.com/SAP/openui5 λͺ¨λ“ˆ μ‹œμŠ€ν…œ (AMD와 μœ μ‚¬)을 ν†΅ν•΄λ‘œλ“œν•˜κ³  ν”„λ‘œλ•μ…˜ 용으둜 만 λ²ˆλ“€λ‘œ μ œκ³΅ν•©λ‹ˆλ‹€.

Typescript 버전 : 2.2.1

λ„μ›€μ΄λ˜κΈ°λ₯Ό λ°”λžλ‹ˆλ‹€.

@geekflyer 맀우 λ„μ›€μ΄λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

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