Typescript: κ°•μ œ μˆ˜μž…

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

이 μž‘μ—…μ„ μˆ˜ν–‰ ν•  μ‹œλ‚˜λ¦¬μ˜€κ°€ 많이 μžˆμŠ΅λ‹ˆλ‹€.

import myExternalModule = require("./myExternalModule");
// not using myExternalModule here

λ‚΄ μ½”λ“œμ—μ„œ myExternalModule 을 μ‚¬μš©ν•˜μ§€ μ•Šμ§€λ§Œ requirejsλ₯Ό μ‚¬μš©ν•˜μ—¬ ν¬ν•¨λ˜κΈ°λ₯Ό μ›ν•©λ‹ˆλ‹€. λ‚˜λŠ” 거기에 μžˆμ–΄μ•Όν•©λ‹ˆλ‹€.
forceimport ν‚€μ›Œλ“œκ°€ μžˆλ‹€λ©΄ 맀우 λ©‹μ§ˆ κ²ƒμž…λ‹ˆλ‹€!

Question

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

κ·Έλž˜μ„œ κ·Έλƒ₯ μΆ”κ°€ν•˜μ§€ μ•ŠλŠ” 이유

import * as React from "react"; // get the types
import "react";  // just for side effect

좜λ ₯μ—μ„œ λ§ˆμ§€λ§‰ κ°€μ Έ 였기 : import "react" λŠ” μ œκ±°λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

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

μ“°κΈ°λ₯Ό 톡해 κ°•μ œλ‘œ 방좜 ν•  수 μžˆμ–΄μ•Όν•©λ‹ˆλ‹€.

var myExternalModule = require("./myExternalModule");

κ·ΈλŸ¬λ‚˜ "./myExternalModule"이 잘λͺ»λœ 경둜이면 λΆˆν‰ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μ˜¬λ°”λ₯Έ μ ‘κ·Ό 방식은 λΆ€μž‘μš©μ΄μ—†λŠ” 더미 μ°Έμ‘°λ₯Ό λ„μž…ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

import myExternalModule = require("./myExternalModule"); 
myExternalModule;

이것은 ν•΄ν‚Ήμ΄μ§€λ§Œ λ‹€μ†Œ 쒁은 μ‚¬μš© 사둀에 λŒ€ν•΄ μƒˆλ‘œμš΄ ꡬ문이 λ„μž… 될 κ°€λŠ₯성은 거의 μ—†μŠ΅λ‹ˆλ‹€. λ””μžμΈ λͺ©ν‘œλ₯Ό ν™•μΈν•˜μ‹­μ‹œμ˜€.

TypeScriptκ°€ var myExternalModule = require("./myExternalModule"); 의 경둜λ₯Ό ν™•μΈν•˜λ©΄ μ‚¬μš©μžκ°€ 해킹에 μ˜μ‘΄ν•˜μ§€ μ•Šκ³ λ„ κ°•μ œλ‘œ emit _ 및 _ 컴파일 νƒ€μž„ 확인을받을 수 μžˆμŠ΅λ‹ˆλ‹€.

var μ ‘κ·Ό 방식은 λͺ¨λ“ˆμ—μ„œ μœ ν˜•μ„ κ°€μ Έ μ˜€μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λ˜ν•œ ν•„μš”ν•œ 경우 amd-dependency 속성을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 물건을 μˆ˜μž…ν•˜λŠ” λͺ©μ μ€ λ¬΄μ—‡μž…λ‹ˆκΉŒ?

예λ₯Ό λ“€μ–΄ 각도 μ•±μ—μ„œ λ‹€λ₯Έ νŒŒμΌμ— λͺ‡ 가지 μ§€μ‹œλ¬Έμ΄ μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ μ§€μ‹œλ¬Έμ„ κ°€μ Έμ™€μ•Όν•©λ‹ˆλ‹€. 그렇지 μ•ŠμœΌλ©΄ html 마크 업이 μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. κ·Έλž˜λ„ JavaScriptμ—μ„œλŠ” μ‚¬μš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
일반적으둜 κ°λ„μ—μ„œ λŒ€λΆ€λΆ„μ˜ λͺ¨λ“ˆμ€ λΆ„λ¦¬λ˜κ³  μ„œλ‘œ 쒅속성이 μ—†μ§€λ§Œ 전체 앱이 μž‘λ™ν•˜λ €λ©΄ κ°€μ Έμ™€μ•Όν•©λ‹ˆλ‹€.

: +1 :
ν—·κ°ˆλ¦¬λ„€μš”.
TypeScript μ»΄νŒŒμΌλŸ¬κ°€ 그것을 μ œκ±°ν•˜λŠ” μ΄μœ λŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ?
μ™ΈλΆ€ λͺ¨λ“ˆμ€ μΈμŠ€ν„΄μŠ€ν™”λ˜μ§€ μ•Šμ€ λͺ¨λ“ˆμ΄ μ•„λ‹™λ‹ˆλ‹€.
ν•„μš”λŠ” λΆ€μž‘μš©μ΄ μžˆμŠ΅λ‹ˆλ‹€.
import μ ˆμ€ AMD 및 CommonJS의 μš”κ΅¬ 사항과 ν˜Έν™˜λ˜λŠ” κ²ƒμœΌλ‘œ λ³΄μž…λ‹ˆλ‹€. ν•˜μ§€λ§Œ 그렇지 μ•ŠμŠ΅λ‹ˆλ‹€.

이 λ¬Έμ œλŠ” μ‹€μ œλ‘œ 아무것도 λ‚΄ 보내지 μ•Šκ³  λŒ€μ‹  es5-shim , es6-shim λ“±κ³Ό 같은 μ „μ—­ κ°œμ²΄μ— λŒ€ν•œ shim κΈ°λŠ₯을 μ‚¬μš©ν•˜λŠ” require ()-ing λͺ¨λ“ˆλ„ μ„±κ°€ μ‹œκ²Œν•©λ‹ˆλ‹€.

ν—·κ°ˆλ¦¬λ„€μš”.
TypeScript μ»΄νŒŒμΌλŸ¬κ°€ 그것을 μ œκ±°ν•˜λŠ” μ΄μœ λŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ?

λ•Œλ‘œλŠ” λͺ¨λ“ˆμ—μ„œ μœ ν˜• 정보 만 κ°€μ Έμ˜€κ³  μ‹ΆκΈ° λ•Œλ¬Έμ— μ΅œμ ν™”μž…λ‹ˆλ‹€.

import foo = require('foo');

function bar(paramOne: foo.ParamOne, paramTwo: foo.ParamTwo){}

단지 μ΅œμ ν™”κ°€ μ•„λ‹™λ‹ˆλ‹€. κ°€μ Έμ˜¨ λͺ¨λ“ˆμ„ μœ ν˜•μ—λ§Œ μ‚¬μš©ν•˜λŠ” 경우 (즉, κ°’ μœ„μΉ˜μ—μ„œ μ‚¬μš©λ˜μ§€ μ•ŠμŒ), λͺ¨λ“ˆμ΄ λŸ°νƒ€μž„μ— μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” μ£Όλ³€ μœ ν˜• μ „μš© λͺ¨λ“ˆ 일 수 μžˆμœΌλ―€λ‘œ 이에 λŒ€ν•œ ν•„μˆ˜ λ‘œμ§μ„ 내보낼 수 μ—†μŠ΅λ‹ˆλ‹€. λͺ¨λ“ˆ κ°€μ Έ 였기λ₯Ό λ‚΄ 보내면 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” λͺ¨λ“ˆμ„λ‘œλ“œν•˜λ €λŠ” λŸ°νƒ€μž„ 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

이λ₯Ό μœ„ν•΄ amd-dependency ν”Œλž˜κ·Έλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

/// <amd-dependency path="foo" />

import x = require('foo');

μ•½κ°„μ˜ ν•΄ν‚Ήμ²˜λŸΌ λ³΄μ΄λŠ” <amd-dependency> λŒ€μ‹  <reference name="..."> IMOλ₯Ό μ‚¬μš©ν•˜λŠ” 것이 ν₯λ―Έ λ‘œμ› μ„ κ²ƒμž…λ‹ˆλ‹€.

@danquirk TypeScript 엔진이 import 문을 μ΅œμ ν™”ν•˜λŠ” μ±…μž„μ„ λ§‘λŠ” 것은 μž„μ˜μ μ΄κ³  μœ„ν—˜ν•œ μΌμž…λ‹ˆλ‹€. TypeScriptκ°€ 아직 JavaScriptμ—μ„œ μΊ‘μ²˜ν•˜μ§€ μ•ŠλŠ” νŒ¨ν„΄μ΄ 많이 μžˆμŠ΅λ‹ˆλ‹€. ν•œ 가지 μ˜ˆλŠ” this 이 # 229 μœ ν˜•μ„ κ°€μ§ˆ 수 μžˆλ‹€λŠ” 것을 ν•΄κ²°ν•˜μ§€ μ•ŠλŠ” λ°©λ²•μž…λ‹ˆλ‹€.

ImportλŠ” ν˜„μž¬ μ½”λ“œκ°€λ‘œλ“œλ˜κΈ° 전에 μ’…μ†μ„±μ„λ‘œλ“œν•˜λŠ” 데 μ‚¬μš©λ˜λ©° 직접 μ°Έμ‘° ν•  수 μ—†μŠ΅λ‹ˆλ‹€. 각도 쒅속성은 ν•œ 가지 예이며 jQuery ν”ŒλŸ¬κ·ΈμΈμ€ 또 λ‹€λ₯Έ μ˜ˆμž…λ‹ˆλ‹€. κΈ°λ³Έ 개체λ₯Ό ν™•μž₯ν•˜κ³  직접 μ°Έμ‘°λ˜μ§€ μ•ŠλŠ” λͺ¨λ“  λΌμ΄λΈŒλŸ¬λ¦¬λŠ” "κΈ°λŠ₯"의 영ν–₯μ„λ°›μŠ΅λ‹ˆλ‹€. 둜컬 정적 뢄석을 기반으둜 μž„ν¬νŠΈλ₯Ό μž„μ˜λ‘œ ν¬ν•¨ν•˜μ§€ μ•ŠκΈ°λ‘œ κ²°μ •ν•¨μœΌλ‘œμ¨ μž„ν¬νŠΈ 문을 μž‘μ„±ν•œ 개발자의 λͺ…μ‹œμ μΈ μ˜λ„μ— λŒ€ν•΄ C μŠ€νƒ€μΌ 컴파일러 νŒ¨ν„΄μ„ λΆ€κ³Όν•˜κ²Œλ©λ‹ˆλ‹€. import μž‘μ„±μ— λŒ€ν•œ κΈ°λŒ€λŠ” μ’…μ†μ„±μœΌλ‘œ ν¬ν•¨λ˜κ³  λͺ¨λ“ˆμ˜ 둜컬 λ²”μœ„μ—μ„œ μ‚¬μš©ν•  수 μžˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. λ‹€λ₯Έ λͺ¨λ“  μž‘μ—…μ€ λͺ¨λ“ˆ 내뢀에 import λ₯Ό μž‘μ„±ν•˜κΈ°λ‘œ μ„ νƒν•œ μžμ—°μŠ€λŸ¬μš΄ κΈ°λŒ€μ— λŒ€ν•œ λΆ€μž‘μš©μž…λ‹ˆλ‹€.

이 경우 TypeScript μ»΄νŒŒμΌλŸ¬λŠ” 더 적은 μž‘μ—…μ„ μˆ˜ν–‰ν•˜κ³  더 λ§Žμ€ μž‘μ—…μ„ μˆ˜ν–‰ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

TypeScript μ°¨κΈ° λ¦΄λ¦¬μŠ€λŠ” ES6 μŠ€νƒ€μΌ λͺ¨λ“ˆμ„ μ§€μ›ν•©λ‹ˆλ‹€ (ν˜„μž¬ λ³€κ²½ 사항은 λ§ˆμŠ€ν„°μ— 있음). λ”°λΌμ„œ μ›ν•˜λŠ” λͺ¨λ“  것이 쒅속성을 μ„ μ–Έν•˜λŠ” 것이라면 λ‹€μŒμ„ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

import "myLib";

μ»΄νŒŒμΌλŸ¬λŠ”μ΄ κ°€μ Έ 였기λ₯Ό μ œκ±°ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

기쑴의 μΌκ΄€λ˜μ§€ μ•Šμ€ 행동이 ν•΄κ²° λ κΉŒμš”, μ•„λ‹ˆλ©΄ μ‚¬λžŒλ“€μ΄ 발견 ν•  μˆ˜μžˆλŠ” μž¬λ―ΈμžˆλŠ” κ²ƒμœΌλ‘œ λ‚¨μ„κΉŒμš”? import κ°€ νŒŒμΌμ„ μ’…μ†μ„±μœΌλ‘œ μΆ”κ°€ν•˜μ§€ μ•ŠλŠ” 경우 λ¬Έμ„œμ— μΆ”κ°€ν•΄μ•Όν•©λ‹ˆκΉŒ? TypeScript AMD λͺ¨λ“ˆμ„ λΉŒλ“œ ν•  λ•Œ ///<reference... 이제 였λ₯˜λ‘œ κ°„μ£Όλ©λ‹ˆκΉŒ?

ν˜„μž¬ import μž‘λ™ 방식은 잘λͺ»λœ μ„€κ³„μž…λ‹ˆλ‹€. λ‚˜μœ λ””μžμΈμ€ λͺ¨ν˜Έμ„±μ„ λ§Œλ“­λ‹ˆλ‹€. μΆ”κ°€ λ™μž‘μ΄ λͺ…ν™•ν•˜κ²Œ μ •μ˜λ˜μ§€ μ•ŠμœΌλ©΄ λΆ€μž‘μš©μ΄μ§€λ§Œ 발견 될 κ°€λŠ₯성이 λ†’μŠ΅λ‹ˆλ‹€. λ”°λΌμ„œμ΄ ν¬λŸΌμ—μ„œ OP, λ‚˜ μžμ‹  및 이와 κ΄€λ ¨λœ 기타 의견 및 버그가 μžˆμŠ΅λ‹ˆλ‹€.

Common λ˜λŠ” Require μŠ€νƒ€μΌ 쒅속성 관리λ₯Ό μ‚¬μš©ν•  λ•Œ 이미 μ‘΄μž¬ν•˜λŠ” κΈ°μ‘΄ 사둀가 μžˆμŠ΅λ‹ˆλ‹€. import 의 κ΅¬ν˜„μ€ λ¬΄μ‹œλ˜μ—ˆμŒμ„ λ³΄μ—¬μ€λ‹ˆλ‹€.

λ¬Έμ„œμ™€ κ΄€λ ¨ν•˜μ—¬ 사양 μ„Ήμ…˜ 11.2.5 및 μ„Ήμ…˜ 11.2.6을 μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€.

μ™ΈλΆ€ κ°€μ Έ 였기 선언은 생성 된 JavaScriptμ—μ„œ λͺ¨λ“ˆ μ‹œμŠ€ν…œ ν˜ΈμŠ€νŠΈμ—μ„œ μ œκ³΅ν•˜λŠ” 'require'ν•¨μˆ˜μ— λŒ€ν•œ 호좜둜 μ΄ˆκΈ°ν™” 된 λ³€μˆ˜λ‘œ ν‘œμ‹œλ©λ‹ˆλ‹€. κ°€μ Έμ˜¨ λͺ¨λ“ˆ λ˜λŠ” κ°€μ Έμ˜¨ λͺ¨λ“ˆμ„ μ°Έμ‘°ν•˜λŠ” 둜컬 별칭 (μ„Ήμ…˜ 10.3)이 κ°€μ Έ μ˜€λŠ” λͺ¨λ“ˆμ˜ λ³Έλ¬Έ μ–΄λ”˜κ°€μ— PrimaryExpression으둜 μ°Έμ‘°λ˜λŠ” κ²½μš°μ—λ§Œ νŠΉμ • κ°€μ Έμ˜¨ λͺ¨λ“ˆμ— λŒ€ν•΄ λ³€μˆ˜ μ„ μ–Έ 및 'require'호좜이 λ°œμƒν•©λ‹ˆλ‹€. κ°€μ Έμ˜¨ λͺ¨λ“ˆμ΄ ModuleName λ˜λŠ” TypeQueryExpression으둜 만 μ°Έμ‘°λ˜λŠ” 경우 아무것도 λ°©μΆœλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€ _.

/// μ°Έμ‘°λŠ” κ°€μ Έ μ˜€κΈ°μ™€ λ™μΌν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. /// μ°Έμ‘°λŠ” μ „μ—­ λ²”μœ„μ— μΆ”κ°€ 선언을 κ°€μ Έμ˜΅λ‹ˆλ‹€ (예 : dom API). μ΄λŸ¬ν•œ μ—”ν„°ν‹°μ˜ 쑴재λ₯Ό μ‹ λ’°ν•˜λŠ” 것은 μ»΄νŒŒμΌλŸ¬μ— λŒ€ν•œ μ§„μˆ μ΄λ©° 생성 된 μ½”λ“œμ— 영ν–₯을주지 μ•ŠμŠ΅λ‹ˆλ‹€.

λ°˜λ©΄μ— importλŠ” require 문으둜 λ‚΄ λ³΄λ‚΄μ•Όν•©λ‹ˆλ‹€. μœ ν˜• μœ„μΉ˜μ—μ„œλ§Œ κ°€μ Έ 였기λ₯Ό μ‚¬μš©ν•˜λŠ” 경우 μ˜λ„κ°€ λͺ…ν™•ν•˜μ§€ μ•ŠμœΌλ©° μœ ν˜• (λŸ°νƒ€μž„μ— μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” λ””μžμΈ νƒ€μž„ ꡬ성) 만 μ›ν•˜λ©°μ΄ 경우 κ°€μ Έ 였기λ₯Ό μ œκ±°ν•˜λ €λŠ” 경우 , 그렇지 μ•ŠμœΌλ©΄ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” μœ ν˜• μ „μš© λͺ¨λ“ˆμ„ κ°€μ Έμ˜¬ 수 μžˆμŠ΅λ‹ˆλ‹€. μ•„λ‹ˆλ©΄ λΆ€μž‘μš©λ„ μ›ν•©λ‹ˆλ‹€. ν›„μžμ˜ 경우 import "mod"; ꡬ문이 μ˜λ„λ₯Ό μ„ μ–Έν•˜λŠ” 데 더 λͺ…ν™•ν•œ ꡬ문 인 것 κ°™μŠ΅λ‹ˆλ‹€.

@mhegazy λ‚˜λŠ” μƒˆλ‘œμš΄ 문제λ₯Ό μ—΄κ³  싢지 μ•Šμ§€λ§Œ 이것은 React μ„Έκ³„μ—μ„œ μ•½κ°„μ˜ λ¬Έμ œμž…λ‹ˆλ‹€.
μ•„λž˜ μ½”λ“œλ₯Ό μ‚΄νŽ΄λ³΄λ©΄ js둜 컴파일 ν•  λ•Œ React μ°Έμ‘°κ°€ μ½”λ“œμ— ν‘œμ‹œλ˜μ§€ μ•ŠμœΌλ―€λ‘œ 제거되고 ReactRouter 따라 μ½”λ“œκ°€ μ‹€νŒ¨ν•©λ‹ˆλ‹€. μˆ˜μ •μ€ ... 정말 바보가 μ½”λ“œ μ•„λž˜μ— μžˆμŠ΅λ‹ˆλ‹€. 더 λ˜‘λ˜‘ν•œ 방법이 μžˆμŠ΅λ‹ˆκΉŒ? 감사.

import * as React from "react"; var temp = React.DOM;
....

// mf("route.schedules", "") // this is to register a translation
anonymousRoutes.route("/schedules", {
  name: "schedules",
  subscriptions: function() {
    this.register("schedules", subscriptions.subscribe("schedules"));
  },
  action: () => {
    ReactLayout.render(ClearLayout, {content: <Book />});
  }
});

μˆ˜μ •;)-EHM

import * as React from "react"; var temp = React.DOM;
...

ReactRouterκ°€ μ˜μ‘΄ν•˜λ―€λ‘œ μ½”λ“œκ°€ μ‹€νŒ¨ν•©λ‹ˆλ‹€.

var "React"λ˜λŠ” κ°€μ Έ 였기의 일뢀 λΆ€μž‘μš©μ΄ ν•„μš”ν•©λ‹ˆκΉŒ?

κ°€μ Έ 였기의 λΆ€μž‘μš©μ΄ ν•„μš”ν•©λ‹ˆλ‹€. varλŠ” 트랜슀 파일 된 μ½”λ“œμ—μ„œ κ°€μ Έ 였기λ₯Ό μ œκ±°ν•˜μ§€ μ•ŠκΈ° μœ„ν•΄ μΆ”κ°€λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

κ·Έλž˜μ„œ κ·Έλƒ₯ μΆ”κ°€ν•˜μ§€ μ•ŠλŠ” 이유

import * as React from "react"; // get the types
import "react";  // just for side effect

좜λ ₯μ—μ„œ λ§ˆμ§€λ§‰ κ°€μ Έ 였기 : import "react" λŠ” μ œκ±°λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λΆˆν–‰νžˆλ„μ΄ λ‹€ μš°μ¦ˆλŠ” μž‘λ™ν•˜μ§€ μ•ŠμœΌλ©° μ—¬μ „νžˆ λ‹€μŒκ³Ό 같은 κ²°κ³Όλ₯Ό μ–»μŠ΅λ‹ˆλ‹€.

ReferenceError: React is not defined
    at action [as _action] (schedule_router.jsx:15)
    at Route.callAction (kadira_flow-router.js?f961d732ed2b89a53d490af5979b899800aa1a5d:2306)
    at kadira_flow-router.js?f961d732ed2b89a53d490af5979b899800aa1a5d:2025
    at Object.Tracker.nonreactive (tracker.js:560)
    at kadira_flow-router.js?f961d732ed2b89a53d490af5979b899800aa1a5d:2016
    at Tracker.Computation._compute (tracker.js:294)
    at Tracker.Computation._recompute (tracker.js:313)
    at Object.Tracker._runFlush (tracker.js:452)
    at Object.Tracker.flush (tracker.js:412)
    at Router._invalidateTracker (kadira_flow-router.js?f961d732ed2b89a53d490af5979b899800aa1a5d:2065)

λ‚˜λŠ” 여기에 ν•„μš”ν•œ λͺ¨λ“  μ°Έμ‘°λ₯Ό μ œκ³΅ν•˜κΈ° μœ„ν•΄ _callee_에 μ˜μ‘΄ν•˜λŠ” Meteor의 "μ•½ν•œ 쒅속성"이라고 μƒκ°ν•©λ‹ˆλ‹€.

μ €λŠ” 졜근 Angular 2의 타이프 슀크립트λ₯Ό 배우기 μ‹œμž‘ν–ˆμŠ΅λ‹ˆλ‹€. 이것은 λ‹€λ₯Έ μƒˆλ‘œμš΄ μ‚¬λžŒλ“€μ—κ²Œλ„ κ·Έλ ‡κ²Œ 될 것이라고 ν™•μ‹ ν•˜κΈ° λ•Œλ¬Έμ— μ—¬λŸ¬ 번 μ €λ₯Ό μ‚¬λ‘œ μž‘μ•˜μŠ΅λ‹ˆλ‹€. 이것이 μ΅œμ ν™”λΌλŠ” 것을 μ΄ν•΄ν•˜μ§€λ§Œ μ‹€μ œλ‘œλŠ” 맀우 ν˜Όλž€ μŠ€λŸ½μŠ΅λ‹ˆλ‹€. λ‚΄ ts νŒŒμΌμ— 무언가λ₯Ό μž…λ ₯ν•˜λ©΄ λ‹¨μˆœνžˆ λ¬΄μ‹œν•˜μ§€ μ•Šκ³  생성, 좜λ ₯ λ˜λŠ” μ–΄λ–€ μ’…λ₯˜μ˜ 것을 κΈ°λŒ€ν•©λ‹ˆλ‹€. require 문을 κ°•μ œλ‘œ 생성 ν•  수 μžˆμ§€λ§Œ μ•½κ°„ 엉망인 것 κ°™μŠ΅λ‹ˆλ‹€. 이것은 μ‚¬μš©μžλ‘œμ„œ λ‚΄κ°€ μ»΄νŒŒμΌλŸ¬κ°€ μ΅œμ„ μ„ κ²°μ •ν•˜μ§€ μ•Šκ³  λ‚΄ μžμ‹ μ˜ 결정을 내릴 수 μžˆμ–΄μ•Όν•˜λŠ” 원인 인 것 κ°™μŠ΅λ‹ˆλ‹€.

TypeScriptλŠ” κ°’ μœ„μ— μœ ν˜• 선언을 μ˜€λ²„λ ˆμ΄ν•˜λ―€λ‘œ λ™μΌν•œ κ°€μ Έ 였기 ꡬ문이 μœ ν˜•, κ°’ λ˜λŠ” λ‘˜ λ‹€λ₯Ό κ°€μ Έμ˜΅λ‹ˆλ‹€. 이것은 λͺ¨λ“ˆ μž‘μ—…μ„ 맀우 νŽΈλ¦¬ν•˜κ³  μ§κ΄€μ μœΌλ‘œ λ§Œλ“­λ‹ˆλ‹€. λ‹€λ₯Έ λͺ¨λ“ˆμ—μ„œ μœ ν˜•μ΄ ν•„μš”ν•œ 경우 λ³€μˆ˜λ₯Ό κ°€μ Έμ˜¬ λ•Œ κ°€μ Έ μ˜€κ±°λ‚˜ 클래슀λ₯Ό κ°€μ Έ μ™€μ„œ μœ ν˜•κ³Ό μƒμ„±μžλ‘œ λͺ¨λ‘ μ‚¬μš©ν•˜μ‹­μ‹œμ˜€.

μ΄κ²ƒμ˜ λ°˜λŒ€λ‘œ, μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” λͺ¨λ“ˆμ€ 단지 νƒ€μž… μ»¨ν…Œμ΄λ„ˆμ΄κΈ° λ•Œλ¬Έμ— κ°€μ Έ 였기λ₯Ό ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ»΄νŒŒμΌλŸ¬κ°€ μ΄λŸ¬ν•œ λͺ¨λ“ˆμ— λŒ€ν•œ μ°Έμ‘°λ₯Ό λ‚΄ 보낸 경우 λŸ°νƒ€μž„μ— μ‹€νŒ¨ν•©λ‹ˆλ‹€. μš°λ¦¬κ°€ κ°€μ§€κ³ μžˆλŠ” 해결책은 κ°€μ Έ μ˜€κΈ°κ°€ μ‚¬μš© 된 _how_λ₯Ό κ°μ§€ν•˜κ³  _all_ μ°Έμ‘°κ°€ μœ ν˜•μœΌλ‘œ μ‚¬μš© 된 λ‹€μŒ λŸ°νƒ€μž„μ— ν•„μš”ν•˜μ§€ μ•Šκ³  μ œκ±°λ˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

λΆ„λͺ…νžˆ λͺ¨λ“ˆμ˜ λΆ€μž‘μš©μ΄ ν•„μš”ν•œ 경우 ν˜Όλž€ 슀러울 수 μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λ‹€λ₯Έ 방법은 κΈ°μ‘΄ λͺ¨λ“ˆμ΄ μ•„λ‹Œ λͺ¨λ“ˆμ— λŒ€ν•œ κ°€μ Έ μ˜€κΈ°κ°€ 생성 된 κ²½μš°μ—λ„ ν˜Όλž€ μŠ€λŸ½μŠ΅λ‹ˆλ‹€. λ™μΌν•œ κ΅¬λ¬Έμ—μ„œ μœ ν˜•κ³Ό 값을 ν•¨κ»˜ λ¬ΆλŠ” νŽΈμ˜μ„±μ„ μžƒμ–΄ λ²„λ €μ•Όν•©λ‹ˆλ‹€.

ν•΄κ²° 방법 :
κΈ°μ‘΄ 해상도 ( moduleResolution κ°€ node μ„€μ •λ˜μ§€ μ•ŠμŒ)λ₯Ό μ‚¬μš©ν•˜λŠ” 경우 μ‹λ³„μžμ— ! κ°€ 포함 된 import 문은 μ ˆλŒ€λ‘œ λΉ μ Έ λ‚˜κ°€μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” 이것이 μš°λ¦¬κ°€ systemjs λ™μž‘μ„ 더 잘 μ§€μ›ν•˜λ €λŠ” μš°λ¦¬μ™€ 관련이 μžˆλ‹€κ³  μƒκ°ν•˜μ§€λ§Œ κ°•μ œλ‘œ κ°€μ Έ μ˜€λŠ” 데 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. systemjs, requirejs λ˜λŠ” λͺ¨λ“ˆ μ‹λ³„μžλ₯Ό λ‹€μ‹œ 맀핑 ν•  μˆ˜μžˆλŠ” λ‘œλ”λ₯Ό μ‚¬μš©ν•˜λŠ” 경우 !js λ˜λŠ” μœ μ‚¬ν•œ ν‘œμ‹œλ‘œ κ°•μ œ κ°€μ Έ 였기λ₯Ό μ’…λ£Œν•˜κ³  λͺ¨λ“ˆ λ‘œλ”λ‘œ 맀핑 ν•  수 μžˆμŠ΅λ‹ˆλ‹€. TSλŠ” κ°€μ Έ 였기λ₯Ό κ·ΈλŒ€λ‘œ 내보내고 (μœ ν˜• 검사 λ‚˜ 해결을 μ‹œλ„ν•˜μ§€ μ•ŠμŒ) λ‘œλ”κ°€ κ°€μ Έ 였기λ₯Ό μ΄ν•΄ν•˜λŠ” 방법을 배울 수 μžˆμŠ΅λ‹ˆλ‹€.

νŒ€μ€ 이미 checker.ts와 같은 μ΄λŸ¬ν•œ μœ ν˜•μ˜ κ°€μ Έ μ˜€κΈ°μ— λŒ€ν•΄ νŠΉμˆ˜ν•œ μ½”λ“œλ₯Ό μž‘μ„±ν•΄μ•Όν•˜λŠ” κ²ƒμœΌλ‘œ λ³΄μž…λ‹ˆλ‹€.

// If we're compiling under --jsx react, the symbol 'React' should
// be marked as 'used' so we don't incorrectly elide its import. And if there
// is no 'React' symbol in scope, we should issue an error.
if (compilerOptions.jsx === JsxEmit.React) {
    let reactSym = resolveName(node.tagName, "React", SymbolFlags.Value, Diagnostics.Cannot_find_name_0, "React");
    if (reactSym) {
        getSymbolLinks(reactSym).referenced = true;
    }
}

@mhegazyκ°€ μ§€μ ν–ˆλ“―μ΄ 이것은 μ΅œμ ν™”μ— κ΄€ν•œ 것이 μ•„λ‹ˆλΌ λŸ°νƒ€μž„ 였λ₯˜λ₯Ό μœ λ°œν•  μˆ˜μžˆλŠ” λŸ°νƒ€μž„ μ •μ˜ (예 : μΈν„°νŽ˜μ΄μŠ€)없이 κ°€μ Έ 였기λ₯Ό μš”κ΅¬ν•˜μ§€ μ•ŠλŠ” κ²ƒμž…λ‹ˆλ‹€.

λ‚˜λŠ” μ–΄λ–€ 일이 더 자주 일어날 지 μ˜λ¬Έμ΄λ‹€. κ°€μ Έ μ˜€κΈ°κ°€ * .d.ts인지 μ‰½κ²Œ 감지 ν•  수 μžˆμœΌλ―€λ‘œ μ‰½κ²Œ 제거 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ‚˜λ¨Έμ§€ κ²½μš°μ—λŠ” μ»΄νŒŒμΌλŸ¬κ°€ κ°€μ Έμ˜¨ λͺ¨λ“ˆμ— λŸ°νƒ€μž„ 좜λ ₯이 μ—†λ‹€λŠ” 것을 κ°μ§€ν•˜κ³  ν•΄λ‹Ή κ°€μ Έ 였기만 μ œκ±°ν•˜λŠ” 것이 맀우 μ‚¬μ†Œν•œ κ²ƒμ²˜λŸΌ λ³΄μž…λ‹ˆλ‹€.

DRY κ΄€μ μ—μ„œ,이 μ œμ•ˆμ€ λ‹Ήμ‹ μ˜ 트랜슀 νŒŒμΌλŸ¬κ°€ μ €λ₯Ό μœ„ν•΄μ΄ 볡제 된 μ½”λ“œλ₯Ό μž‘μ„±ν•  μˆ˜μžˆλŠ” 트랜슀 νŒŒμΌλŸ¬κ°€ 있기λ₯Ό λ°”λžλ‹ˆλ‹€.

import * as React from "react"; // get the types
import "react";  // just for side effect

내가보기에, λŸ°νƒ€μž„μ—λ‘œλ“œν•΄μ•Όν•˜λŠ”μ§€ μ—¬λΆ€λŠ” _imported_ 파일의 μ„ νƒμ΄μ–΄μ•Όν•©λ‹ˆλ‹€ (λΆ€μž‘μš©μ΄ μžˆμŒμ„ μ•Œκ³  있기 λ•Œλ¬Έ). 이것은 _loading_ 파일 (즉, import λ¬Έμ΄μžˆλŠ” 파일)에 μ˜ν•΄ κ²°μ •λ˜μ–΄μ„œλŠ” μ•ˆλ©λ‹ˆλ‹€. λ‹€λ₯Έ 파일 / λͺ¨λ“ˆμ˜ κ΅¬ν˜„ μ„ΈλΆ€ 사항을 μ•„λŠ” 것은 업무가 μ•„λ‹ˆκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

적어도 이것은 angularjs κ΄€μ μ—μ„œ 잘 μž‘λ™ ν•  κ²ƒμž…λ‹ˆλ‹€. μ—¬κΈ°μ„œ μ§€μ‹œλ¬Έκ³Ό μ„œλΉ„μŠ€λ₯Ό μ •μ˜ν•˜λŠ” νŒŒμΌμ€ μ°Έμ‘°λ˜λŠ” 경우 λŸ°νƒ€μž„μ—λ‘œλ“œλ˜μ–΄μ•Όν•œλ‹€λŠ” 것을 "μ•Œκ³ "μžˆμœΌλ―€λ‘œ μ»΄νŒŒμΌλŸ¬κ°€μ΄λ₯Ό μ œκ±°ν•΄μ„œλŠ” μ•ˆλ©λ‹ˆλ‹€. typescript μ»΄νŒŒμΌλŸ¬μ— "μ œκ±°ν•˜μ§€ μ•ŠμŒ"에 λŒ€ν•œ 파일의 νžŒνŠΈκ°€μ΄ IMOλ₯Ό μˆ˜μ •ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λ‚˜λŠ” μ•„λ§ˆλ„ μ—¬κΈ°μ„œ 일뢀 μ‚¬μš© 사둀λ₯Ό κ°„κ³Όν•˜κ³ μžˆμ„ κ²ƒμž…λ‹ˆλ‹€.

-JM

xmodule.ts :

console.log('ive been imported');
export class X {
}
import {X} from "xmodule"; // get the types
import "xmodule";  // just for side effect

xmodule에 λͺ…λ Ήλ¬Έ (예 : console.log λͺ…λ Ήλ¬Έ)μ΄μžˆλŠ” 경우 μ •μ˜μ— 따라 μ„ μ–Έ 더미가 μ•„λ‹™λ‹ˆλ‹€. xmodule이 일련의 μœ ν˜• μ„ μ–Έ μ΄μƒμœΌλ‘œ κ°„μ£Όλ˜λ„λ‘ xmodule을 μ‚¬μš©ν•˜λŠ” λͺ…령문을 λ§Œλ“œλŠ” 것은 λ°˜μž… λͺ¨λ“ˆμ˜ μ±…μž„μ΄ μ•„λ‹™λ‹ˆλ‹€.

λΏ‘ 빡뀨

κ°•μ œλ‘œ κ°€μ Έ 였기 μœ„ν•΄ 강타λ₯Ό μ‚¬μš©ν•œλ‹€κ³  μ–ΈκΈ‰ν–ˆμŠ΅λ‹ˆλ‹€. 그것은 λ‚΄ μ‹œλ‚˜λ¦¬μ˜€μ— μ„ ν˜Έλ©λ‹ˆλ‹€. κ·Έλž˜λ„ μ–΄λ–»κ²Œ μ‚¬μš©ν•©λ‹ˆκΉŒ? λ‹€μŒμ„ λͺ¨λ‘ μ‹œλ„ν–ˆμŠ΅λ‹ˆλ‹€.

!import {Service} from './service';
import! {Service} from './service';
import {!Service} from './service';
import {Service!} from './service';
import {Service} from '!./service';
import {Service} from './service!';
import {Service} from !'./service';
import {Service} from './service'!;

그것은 λ¬Έμžμ—΄μ— μžˆμ—ˆμ§€λ§Œ μ΅œκ·Όμ— 경둜 맀핑이 λ„μž…λ˜μ—ˆμ„ λ•Œ λ™μž‘μ΄ μ œκ±°λ˜μ—ˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

λ‚˜λŠ” λ…Έλ“œ 래퍼λ₯Ό κ°€μ Έ 였기 μœ„ν•΄ react와 같은 라이브러리λ₯Ό μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

import { h, Component } from "preact";

λ¬Όλ‘  λŸ°νƒ€μž„μ—λŠ” hκ°€ μ—†μŠ΅λ‹ˆλ‹€. μ™œ 거기에 μžˆμ—ˆμ„κΉŒμš”? λ˜ν•œ jsx와 ν•¨κ»˜ μ‚¬μš©ν•˜λ©΄ TypeScriptλŠ” μ‹€μ œλ‘œ h에 κ΄€ν•œ 것이 μ•„λ‹ˆμ§€λ§Œ babel은 μ•Œκ³  μžˆμŠ΅λ‹ˆλ‹€.

κ·Έλž˜μ„œ 남은 것은 h와 같은 μ°Έμ‘°λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. μˆ˜μž… ν›„, λ„€?

h (λ˜λŠ” λ‹€λ₯Έ μ‚¬μš©μž 지정 jsx νŒ©ν† λ¦¬)의 경우 --jsxFactory λ₯Ό μ‚¬μš©ν•˜μ—¬ μ»΄νŒŒμΌλŸ¬μ—κ²Œ 이것이 λŸ°νƒ€μž„μ— μ‚¬μš©μ€‘μΈ νŒ©ν† λ¦¬μž„μ„ μ•Œλ¦½λ‹ˆλ‹€. 예 : --jsxFactory h .

μ§€κΈˆμ€ typescript@next κ°€ ν•„μš”ν•˜μ§€ μ•ŠμœΌλ©° TypeScript 2.1.2μ—μ„œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

@mhegazy 두 μ’…λ₯˜μ˜ JSX μ†ŒλΉ„μž (예 : react 및 snabbdom)κ°€μžˆλŠ” ν”„λ‘œμ νŠΈμ˜ 경우 ν—ˆμš©λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μ›Ή UIλ₯Ό λ Œλ”λ§ν•˜λŠ” 데 λ°˜μ‘μ„ μ‚¬μš©ν•˜κ³  webgl 객체λ₯Ό λ Œλ”λ§ν•˜κΈ° μœ„ν•΄ 직접 κ΅¬ν˜„ ν•œ μ‚¬μš©μž 지정 가상 돔을 μ‚¬μš©ν•˜λŠ” ν”„λ‘œμ νŠΈλ₯Ό 진행 μ€‘μž…λ‹ˆλ‹€. 그리고 λ™μΌν•œ ν”„λ‘œμ νŠΈμ— λŒ€ν•΄ 두 가지 λ‹€λ₯Έ μ’…λ₯˜μ˜ @jsx 주석이 ν•„μš”ν•˜κΈ° λ•Œλ¬Έμ— μ½”λ„ˆ μΌ€μ΄μŠ€μ— λ„λ‹¬ν–ˆμŠ΅λ‹ˆλ‹€.

μ΄μ œλŠ” 우리 μžμ‹ μ˜ h λ₯Ό μ „μ—­ λ³€μˆ˜λ‘œ λ‚΄ λ³΄λ‚΄μ•Όν•©λ‹ˆλ‹€.보기 ν‰ν•©λ‹ˆλ‹€.

이 μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 단일 λΌμ΄λ„ˆ μˆ˜μž…μ΄ ν•„μš”ν•˜κ±°λ‚˜ μ›ν•˜λŠ” 개발자 λͺ©λ‘μ— μ €λ₯Ό 포함 μ‹œν‚€μ‹­μ‹œμ˜€. 이λ₯Ό λ‹¬μ„±ν•˜κΈ°μœ„ν•œ 두 μ€„μ˜ μ†ŒμŠ€λŠ” 특히 μ—¬λŸ¬ λͺ¨λ“ˆμ„ μ—°μ†μœΌλ‘œ κ°€μ Έ μ˜€λ €λŠ” 경우 μ œκ±°ν•˜λ €λŠ” κ²ƒμž…λ‹ˆλ‹€. μ§€κΈˆκΉŒμ§€ κ°€μž₯ 잘 λ“€λ¦¬λŠ” 것은 κ°€μ Έ 였기λ₯Ό κ°•μ œν•˜λŠ” ν‚€μ›Œλ“œ / ꡬ문이라고 μƒκ°ν•©λ‹ˆλ‹€. λ‹€μ‹œ ν•œλ²ˆ κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€!

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