Typescript: μ œμ•ˆ : μ •μ˜ μ „ μ‚¬μš© κΈˆμ§€

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

μ»΄νŒŒμΌλŸ¬λŠ” μ½”λ“œκ°€ μ΄ˆκΈ°ν™”λ˜κΈ° 전에 값을 μ‚¬μš©ν•  λ•Œ 였λ₯˜λ₯Ό λ°œν–‰ν•΄μ•Όν•©λ‹ˆλ‹€.

// Error, 'Derived' declaration must be after 'Base'
class Derived extends Base { }
class Base { }

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

였늘 μš°λ¦¬κ°€ 이것에 λ¬Ό λ Έκ³  무슨 일이 μΌμ–΄λ‚˜κ³  μžˆλŠ”μ§€ μ•Œμ•„λ‚΄λŠ” 데 μ‹œκ°„μ΄ κ±Έλ ΈμŠ΅λ‹ˆλ‹€.

TypeScript v1.8.10, Webpack 기반 λΉŒλ“œ, κΈ°λ³Έ 및 νŒŒμƒ 클래슀 λͺ¨λ‘ λ™μΌν•œ νŒŒμΌμ— μ •μ˜λ˜μ—ˆμ§€λ§Œ (λΆ„λͺ…νžˆ) 잘λͺ»λœ μˆœμ„œλ‘œ, 컴파일 였λ₯˜λ‚˜ κ²½κ³ κ°€ μ—†μœΌλ©°, μ†ŒμŠ€ 맡이 μž‘λ™ν•˜λŠ” κ²½μš°μ—λ„ 였λ₯˜ 호좜 μŠ€νƒμ΄ 맀우 μœ μš©ν•˜μ§€ μ•Šμ€ μœ„μΉ˜ (νŒŒμƒ 된 μœ„μΉ˜λ₯Ό κ°€μ Έ μ˜€λŠ” λ‹€λ₯Έ 클래슀의 끝).

전체 λ…Όμ˜λ₯Ό κ±°μΉ˜μ§€λŠ” μ•Šμ§€λ§Œ 응급 처치둜 컴파일러 κ²½κ³ κ°€ 도움이 될 것 κ°™μŠ΅λ‹ˆλ‹€. 2 Β’

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

컴파일러 였λ₯˜λ₯Ό λ˜μ§€λŠ” 것이 쒋은 ν•΄κ²°μ±…μ΄μ§€λ§Œ μ»΄νŒŒμΌλŸ¬λŠ” μ˜¬λ°”λ₯Έ μˆœμ„œλ‘œ 클래슀λ₯Ό 좜λ ₯ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 그것은 ν‚¬λŸ¬ κΈ°λŠ₯이 될 κ²ƒμž…λ‹ˆλ‹€. 예 : μ»΄νŒŒμΌλŸ¬λŠ” 쒅속성 관계λ₯Ό μΆ”μ ν•˜κ³  이에 따라 클래슀λ₯Ό 좜λ ₯ν•˜μ—¬ 쒅속성 μˆœμ„œλ₯Ό ν•΄κ²°ν•  μˆ˜μ—†λŠ” κ²½μš°μ—λ§Œ 컴파일러 였λ₯˜λ₯Ό λ°œμƒμ‹œν‚΅λ‹ˆλ‹€.

μ»΄νŒŒμΌλŸ¬λŠ” 쒅속성 관계λ₯Ό μΆ”μ ν•˜κ³  이에 따라 클래슀λ₯Ό 좜λ ₯ν•˜μ—¬ 쒅속성 μˆœμ„œλ₯Ό ν•΄κ²°ν•  μˆ˜μ—†λŠ” κ²½μš°μ—λ§Œ 컴파일러 였λ₯˜λ₯Ό λ°œμƒμ‹œν‚΅λ‹ˆλ‹€.

μƒˆλ‘œμš΄ μ œμ•ˆμ„ν•΄μ•Όν•©λ‹ˆκΉŒ? 이것이 μ œκ°€ ν˜„μž¬ TypeScript λ‚΄λΆ€ λͺ¨λ“ˆ λŒ€μ‹  AMD λͺ¨λ“ˆμ„ μ‚¬μš©ν•˜λŠ” μ΄μœ μž…λ‹ˆλ‹€. RequireJS μ»΄νŒŒμΌλŸ¬λŠ” μ½”λ“œλ² μ΄μŠ€μ—μ„œ μ§€μ •ν•œ 쒅속성을 μ‚¬μš©ν•˜μ—¬ μ μ ˆν•œ λͺ¨λ“ˆ 직렬화 μˆœμ„œλ₯Ό κ²°μ •ν•©λ‹ˆλ‹€ ( require() ).

# 274에 μ—°κ²°. μš°λ¦¬λŠ” μ΄κ²ƒμ˜ κ·œμΉ™κ³Ό λ²”μœ„λ₯Ό μ„€λͺ…ν•΄μ•Όν•©λ‹ˆλ‹€

extends μΌ€μ΄μŠ€λŠ” μ–΄νœ˜ 검사λ₯Όμœ„ν•œ 쒋은 ν›„λ³΄μ²˜λŸΌ λ³΄μž…λ‹ˆλ‹€. μ–΄νœ˜ 적으둜 κΈ°λ³Έ ν΄λž˜μŠ€κ°€ νŒŒμƒ ν΄λž˜μŠ€λ³΄λ‹€ λ¨Όμ € μ˜€λŠ”μ§€ ν™•μΈν•˜λ©΄λ©λ‹ˆλ‹€. κ³ λ €ν•΄μ•Ό ν•  λ‹€λ₯Έ κ²½μš°κ°€ μžˆμŠ΅λ‹ˆκΉŒ?

ν•œ 가지 λ¬Έμ œλŠ” 클래슀 μ •μ˜λ₯Ό μž¬μ •λ ¬ν•˜λ©΄ 정적 μ΄λ‹ˆμ…œ 라이저 μˆœμ„œκ°€ μžλ™μœΌλ‘œ μž¬μ •λ ¬ 될 수 μžˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. κΈ°λ³Έ ν΄λž˜μŠ€κ°€ νŒŒμƒ 클래슀 뒀에 였면 클래슀 μ •μ˜ μ‚¬μ΄νŠΈμ—μ„œ 정적 μ΄λ‹ˆμ…œ 라이저 μ½”λ“œλ₯Ό μœ μ§€ν•˜κ±°λ‚˜ 였λ₯˜ ν”Œλž˜κ·Έλ₯Ό μ§€μ •ν•©λ‹ˆλ‹€.

λŒ€κ·œλͺ¨ ν”„λ‘œμ νŠΈ / μœ μ§€ 보수 κ΄€μ μ—μ„œ 닀쀑 파일 μΌ€μ΄μŠ€κ°€ 더 ν₯λ―Έλ‘­κ³  μœ μš©ν•˜λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€ (κ²°κ΅­ typescript의 ν‘œλ©΄ 상 λͺ©ν‘œ).

λ”°λΌμ„œ 단일 파일 좜λ ₯ λͺ¨λ“œμ—μ„œ 좜λ ₯ μˆœμ„œλ₯Ό κ³ λ €ν•΄μ•Όν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. (μ—¬λŸ¬ νŒŒμΌμ„ ν¬ν•¨ν•˜λŠ” html νŒŒμΌμ„ λΉŒλ“œν•˜κΈ° μœ„ν•΄μ΄ μˆœμ„œλ₯Ό 얻을 μˆ˜μžˆλŠ” 것도 쒋을 κ²ƒμž…λ‹ˆλ‹€).

λ‹€μŒμ€ 주문을 보μž₯ ν•  μˆ˜μžˆλŠ” λͺ‡ 가지 μ§„μˆ μž…λ‹ˆλ‹€.

class X extends Y {} // ensure Y is defined in prior file
module { new X(); } // ensure X is defined in prior file
class S { static z = new Z(); } // ensure Z is defined in prior file

클래슀뿐만 μ•„λ‹ˆλΌ μ‚¬μš© 전에 μ •μ˜λ˜λŠ” ν•¨μˆ˜μ™€ λ³€μˆ˜λ‘œμ΄λ₯Ό ν™•μž₯ ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

PS ν”„λ‘œν†  νƒ€μž…μ΄ μžˆμŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” 당신을 μœ„ν•΄ 방좜 μˆœμ„œλ₯Ό λ°”κΎΈλ €λŠ” μ˜λ„κ°€ μ—†λ‹€κ³  μƒκ°ν•˜λ©°, λŸ°νƒ€μž„μ— μ‹€νŒ¨ ν•  것이 ν™•μ‹€ν•œ 일에 λŒ€ν•΄ 였λ₯˜λ₯Ό 쀄 수 μžˆμŠ΅λ‹ˆλ‹€.

Dan, 단일 파일 λ‚΄μ—μ„œ μž¬μ •λ ¬ν•˜λŠ” 것에 λ™μ˜ν•˜μ§€λ§Œ --out을 μ‚¬μš©ν•˜μ—¬ μ—¬λŸ¬ νŒŒμΌμ„ κ²°ν•©ν•˜λ©΄ μ»΄νŒŒμΌλŸ¬κ°€ 방좜 μˆœμ„œλ₯Ό μ œμ–΄ ν•  수 있으며 μ„ νƒν•œ μˆœμ„œκ°€ μž‘λ™ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

@sparecycles ν•¨μˆ˜λŠ” λŸ°νƒ€μž„μ— μ–΄μ¨Œλ“  λ²”μœ„μ˜ 맨 μœ„λ‘œ μ˜¬λΌκ°‘λ‹ˆλ‹€. κ·Έλž˜μ„œ κΈ°λŠ₯은 ν₯미둭지 μ•ŠμŠ΅λ‹ˆλ‹€. λ³€μˆ˜λ„ ν˜Έμ΄μŠ€νŠΈλ˜λŠ” 경우 λ¬Έμ œλŠ” ν•΄λ‹Ή μ§€μ μ—μ„œ μ΄ˆκΈ°ν™”λ˜μ§€ μ•ŠλŠ”λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. 이제 μ΄ˆκΈ°ν™” 전에 μ‚¬μš©ν•˜λŠ” 것은 λ‹€λ₯Έ 문제이며 # 274μ—μ„œ μΆ”μ λ˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

μž¬μ •λ ¬μ„ μœ„ν•΄; μš°λ¦¬κ°€ λ”°λžλ˜ 철학은 좜λ ₯ μ½”λ“œλ₯Ό μž…λ ₯ μ½”λ“œμ— μ΅œλŒ€ν•œ κ°€κΉκ²Œ λ§Œλ“œλŠ” κ²ƒμž…λ‹ˆλ‹€. 본질적으둜 μš°λ¦¬λŠ” μ‚¬μš©μž μ½”λ“œλ₯Ό ν†΅κ³Όμ‹œν‚€κ³  μœ ν˜•μ„ μ œκ±°ν•©λ‹ˆλ‹€. 이런 μ˜λ―Έμ—μ„œ 였λ₯˜λŠ” μš°λ¦¬κ°€ μ§€κΈˆκΉŒμ§€ ν•œ 일과 더 λ°€μ ‘ν•œ 관련이 μžˆμŠ΅λ‹ˆλ‹€.

κ΅¬ν˜„μ— κ΄€ν•΄μ„œλŠ” μ΅œκ·Όμ— Letκ³Ό Const둜 μ–΄νœ˜ μˆœμ„œ 검증을 μΆ”κ°€ν–ˆμœΌλ©° 일반적인 κ²€μ‚¬λ‘œ μΆ”μΆœν•˜μ—¬ μ΄λŸ¬ν•œ λ‹€λ₯Έ κ²½μš°μ— μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ—¬κΈ°μ—μ„œ 찾을 수 μžˆμŠ΅λ‹ˆλ‹€.
https://github.com/Microsoft/TypeScript/blob/master/src/compiler/checker.ts#L329

μš°λ¦¬κ°€ ν™•μΈν•˜λŠ” 사둀λ₯Ό λͺ…ν™•ν•˜κ²Œ μ‹λ³„ν•΄μ•Όν•˜λ©° PR은 ν™•μ‹€νžˆ ν™˜μ˜λ°›μ„ κ²ƒμž…λ‹ˆλ‹€ :)

예, 단일 typescript 파일 λ‚΄μ—μ„œ μˆœμ„œλ₯Ό λ³€κ²½ν•˜κ³  싢지 μ•Šλ‹€λŠ” 데 λ™μ˜ν•˜μ§€λ§Œ --out 파일의 경우 μ‚¬μš©μžκ°€ μˆœμ„œλ₯Ό μ§€μ •ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ μ»΄νŒŒμΌλŸ¬κ°€ μ΅œμ„ μ˜ λ…Έλ ₯을 κΈ°μšΈμ΄λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. μž‘λ™ν•˜λŠ” μˆœμ„œλ₯Ό μ„ νƒν•˜μ‹­μ‹œμ˜€.

ν•¨μˆ˜ 호이 μŠ€νŒ…μ€ 단일 파일 μΌ€μ΄μŠ€μ—μ„œ μ‹ κ²½ μ“Έ ν•„μš”κ°€μ—†λŠ” 쒋은 μ˜ˆμ΄μ§€λ§Œ μ—¬λŸ¬ 파일둜 μ»΄νŒŒμΌν•˜κ³  .html νŒŒμΌμ— 포함 ν•  μ‹œν€€μŠ€λ₯Ό μ„ νƒν•˜λŠ” 것이 μ‚¬λžŒμ—κ²ŒλŠ” μ‚¬μ†Œν•œ 일이 아닐 수 μžˆμŠ΅λ‹ˆλ‹€. μ‚¬μš©μ‹œ μ •μ˜λ˜μ§€ μ•Šμ€ λ³€μˆ˜λŠ” /// <reference> μ€„μ˜ λ³€κ²½μœΌλ‘œ 인해 μ»΄νŒŒμΌλŸ¬μ—μ„œ 예기치 μ•Šμ€ λ™μž‘μ΄ λ°œμƒν•  μˆ˜μžˆλŠ” 쒋은 μ˜ˆμž…λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ --out 파일의 경우 μˆœμ„œλŠ” μ‚¬μš©μžκ°€ μ§€μ •ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

이것은 사싀이 μ•„λ‹™λ‹ˆλ‹€. μ—¬κΈ°μ—λŠ” 맀우 κ°„λ‹¨ν•œ κ·œμΉ™μ΄ μžˆμŠ΅λ‹ˆλ‹€. reference νƒœκ·Έκ°€ μ•”μ‹œν•˜λŠ” μˆœμ„œμ™€ λͺ…λ Ή μ€„μ—μ„œ 파일 μˆœμ„œλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. 두 경우 λͺ¨λ‘ μ‚¬μš©μžκ°€ 주문을 μ œκ³΅ν•©λ‹ˆλ‹€. μ»΄νŒŒμΌλŸ¬κ°€ μ‚¬μš©μžκ°€ 제곡 ν•œ μˆœμ„œλ₯Ό λ¬΄μ‹œν•˜κ²Œν•˜λŠ” 것은 μœ„ν—˜ν•œ κ²½λ‘œμž…λ‹ˆλ‹€. μ»΄νŒŒμΌλŸ¬κ°€ μ›ν•˜λŠ” μˆœμ„œμ™€ λ‹€λ₯Έ μˆœμ„œλ₯Ό κ²°μ •ν•˜λ©΄ μ–΄λ–»κ²Œλ©λ‹ˆκΉŒ? κ·Έκ±Έ μ–΄λ–»κ²Œ λ¬΄μ‹œν•˜κ² μŠ΅λ‹ˆκΉŒ? ν•œ 주문이 2 개의 클래슀λ₯Ό μ€‘λ‹¨ν•˜κ³  λ‹€λ₯Έ 주문이 2 개의 λ³€μˆ˜λ₯Ό μ€‘λ‹¨ν•˜λ©΄ μ–΄λ–»κ²Œλ©λ‹ˆκΉŒ?

그런 λ‹€μŒ μˆœμ„œλ₯Ό λ³€κ²½ν•΄μ„œλŠ” μ•ˆλ˜μ§€λ§Œ 적어도 μ»΄νŒŒμΌλŸ¬κ°€ μ‚¬μš©ν•˜λŠ” μˆœμ„œκ°€ 잘λͺ»λ˜μ—ˆμŒμ„ μ‚¬μš©μžμ—κ²Œ κ²½κ³ ν•΄μ•Όν•©λ‹ˆκΉŒ (μ˜΅μ…˜μ΄ μžˆμ–΄μ•Όν•©λ‹ˆκΉŒ)?

예. μš°λ¦¬λŠ” μ£Όλ¬Έν•΄μ„œλŠ” μ•ˆλ˜μ§€λ§Œ λŒ€μ‹  였λ₯˜μž…λ‹ˆλ‹€.

μƒν˜Έ μž¬κ·€ ν΄λž˜μŠ€μ— λŒ€ν•œ TypeScript의 μ˜¬λ°”λ₯Έ κ΄€μš©κ΅¬λŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ? μ‹€μ œ μ •μ˜ 이전에 declare class ?

ν΄λž˜μŠ€κ°€ μœ ν˜• μ‹œμŠ€ν…œμ΄λ‚˜ μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œμ—μ„œ λ‹¨μˆœνžˆ μ„œλ‘œλ₯Ό μ°Έμ‘°ν•˜λŠ” 경우 λ¬Έμ œκ°€λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ¬Έμ œκ°€λ˜λŠ” μœ μΌν•œ "μƒν˜Έ μž¬κ·€"νŒ¨ν„΄μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

class Alpha {
    static myFriendBeta = new Beta();   
}

class Beta {
    static myFriendAlpha = new Alpha(); 
}

이것을 clodule둜 λ‹€μ‹œ μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

class Alpha {
}

class Beta {
    static myFriendAlpha = new Alpha();
}

module Alpha {
    export var myFriendBeta = new Beta();
}

μ’‹μ•„μš”, 'κΈ°λ³Έ ν΄λž˜μŠ€λŠ” νŒŒμƒ ν΄λž˜μŠ€λ³΄λ‹€ λ¨Όμ € μ–΄νœ˜ 적으둜 μ •μ˜λ˜μ–΄μ•Όν•©λ‹ˆλ‹€'외에이 문제의 μΌλΆ€λ‘œ κ΅¬ν˜„ν•˜λ €λŠ” κ·œμΉ™μ€ λ¬΄μ—‡μž…λ‹ˆκΉŒ?

λ‚΄λΆ€ λͺ¨λ“ˆ 멀버에 λŒ€ν•œ ν¬μ›Œλ“œ μ°Έμ‘°λ₯Ό ν—ˆμš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

var x = M.fn(); // Should error
module M {
    export function fn() {}
}

μ—΄κ±° ν˜• 멀버에 λŒ€ν•œ μ „λ°© μ°Έμ‘° κΈˆμ§€

var x = E.A; // Should error
enum E { A }

IMOλŠ” μ‚¬λžŒλ“€μ΄ 일반적으둜 단일 νŒŒμΌμ—μ„œ λͺ¨λ“  μ½”λ“œλ₯Ό μ •μ˜ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ—μ΄ 문제의 λ²”μœ„κ°€ λ‹€μ†Œ μ œν•œμ μž…λ‹ˆλ‹€. κΈ°λ³Έ ν΄λž˜μŠ€λŠ” νŒŒμƒ ν΄λž˜μŠ€μ— λŒ€ν•΄ λ³„λ„μ˜ νŒŒμΌμ— μ‘΄μž¬ν•  κ°€λŠ₯성이 더 ν½λ‹ˆλ‹€.

@sparecycles 의 λ‹€μŒ 사항도이 λ¬Έμ œμ— λŒ€ν•œ ν•΄κ²°μ±…μ˜ μΌλΆ€κ°€λ˜μ–΄μ•Όν•œλ‹€κ³  μ œμ•ˆν•©λ‹ˆλ‹€.

그런 λ‹€μŒ μˆœμ„œλ₯Ό λ³€κ²½ν•΄μ„œλŠ” μ•ˆλ˜μ§€λ§Œ 적어도 μ»΄νŒŒμΌλŸ¬κ°€ μ‚¬μš©ν•˜λŠ” μˆœμ„œκ°€ 잘λͺ»λ˜μ—ˆμŒμ„ μ‚¬μš©μžμ—κ²Œ κ²½κ³ ν•΄μ•Όν•©λ‹ˆκΉŒ (μ˜΅μ…˜μ΄ μžˆμ–΄μ•Όν•©λ‹ˆκΉŒ)?

"μ»΄νŒŒμΌλŸ¬κ°€ μ‚¬μš©ν•˜λŠ” μˆœμ„œ"μ—λŠ” tsconfig μ§€μ •λœ μˆœμ„œκ°€ ν¬ν•¨λ˜μ–΄μ•Όν•©λ‹ˆλ‹€.

κΈ°λ³Έ ν΄λž˜μŠ€μ™€ νŒŒμƒ ν΄λž˜μŠ€κ°€ 같은 νŒŒμΌμ—μžˆμ„ λ•Œ λ¬Έμ œλŠ” 그닀지 λ‚˜μ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. ν”„λ‘œκ·Έλž¨μ€ μ‹œμž‘μ‹œ μΆ©λŒν•˜κ³  ν”„λ‘œκ·Έλž˜λ¨ΈλŠ” ν•΄λ‹Ή 파일의 μˆœμ„œλ₯Ό λ³€κ²½ν•˜κ³  λ¬Έμ œλŠ” _fixed_κ°€λ©λ‹ˆλ‹€.

닀쀑 파일 κ²½μš°λŠ” λ―Έλ¬˜ν•œ 이유둜 μˆœμ„œκ°€ λ³€κ²½ 될 수 μžˆμœΌλ―€λ‘œ λͺ¨ν˜Έν•œ μˆœμ„œλ‘œ μ—¬λŸ¬ νŒŒμΌμ„ μ—°κ²°ν•  λ•Œ μ»΄νŒŒμΌλŸ¬κ°€ κ²½κ³ ν•΄μ•Όν•˜λŠ” κ²½μš°μž…λ‹ˆλ‹€.

κΈ°λ³Έ ν΄λž˜μŠ€μ™€ μ—¬λŸ¬ νŒŒμƒ ν΄λž˜μŠ€κ°€ λͺ¨λ‘ λ³„λ„μ˜ νŒŒμΌμ—μžˆλŠ” 경우λ₯Ό κ³ λ €ν•˜μ‹­μ‹œμ˜€. κΈ°λ³Έ ν΄λž˜μŠ€λŠ” κ΅¬ν˜„μ—μ„œ νŒŒμƒ 클래슀 쀑 일뢀λ₯Ό μ‚¬μš©ν•˜λ―€λ‘œμ΄λ₯Ό μ°Έμ‘°ν•˜μ§€λ§Œ μ—¬μ „νžˆ 좜λ ₯μ—μ„œ ​​가μž₯ λ¨Όμ € λ°°μΉ˜ν•΄μ•Όν•©λ‹ˆλ‹€. λ§ˆμ°¬κ°€μ§€λ‘œ λͺ¨λ“  νŒŒμƒ ν΄λž˜μŠ€λŠ” κΈ°λ³Έ 클래슀λ₯Ό μ°Έμ‘°ν•΄μ•Όν•©λ‹ˆλ‹€.

음, μƒν˜Έ μ°Έμ‘° νŒŒμΌμ—λŠ” λ¬Έμ œκ°€ μ—†μŠ΅λ‹ˆλ‹€. A.tsκ°€ B.tsλ₯Ό μƒν˜Έ μ°Έμ‘°ν•˜κ³  X.ts에 A.tsκ°€ ν¬ν•¨λ˜μ–΄ 있으면 좜λ ₯ μˆœμ„œλŠ” [B, A, X]κ°€λ˜κ³  B.tsλ₯Ό μ°Έμ‘°ν•˜λ©΄ 좜λ ₯ μˆœμ„œκ°€λ©λ‹ˆλ‹€. 주문은 [A, B, X]μž…λ‹ˆλ‹€. (κ·ΈλŸ¬λ‚˜ μ΄λŸ¬ν•œ μˆœμ„œ 쀑 ν•˜λ‚˜λ§Œ λŸ°νƒ€μž„μ— μž‘λ™ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.) B λ˜λŠ” Aκ°€ μ°Έμ‘° 될 경우 컴파일이 λ˜‘κ°™μ΄ 잘 μ„±κ³΅ν•˜λ―€λ‘œ μž‘μ—…μ΄ μ·¨μ•½ ν•΄μ§‘λ‹ˆλ‹€.

λ‚΄ κΈ°λ³Έ νŒŒμƒ 클래슀 μ‹œμŠ€ν…œ λ¬Έμ œμ— λŒ€ν•œ λ‚΄ μ†”λ£¨μ…˜ : λ‚΄ 클래슀 계측 ꡬ쑰에 index.tsλ₯Ό μΆ”κ°€ν•˜κ³ μ΄ νŒŒμΌμ— λͺ¨λ“  νŒŒμƒ ν΄λž˜μŠ€μ™€ κΈ°λ³Έ 클래슀λ₯Ό ν¬ν•¨ν•©λ‹ˆλ‹€. 이것은 좜λ ₯이 κΈ°λ³Έ 클래슀λ₯Ό λ¨Όμ € λ°°μΉ˜ν•œλ‹€λŠ” 것을 보μž₯ν–ˆμŠ΅λ‹ˆλ‹€. (μ™„μ „νžˆ 반 μ§κ΄€μ μž…λ‹ˆλ‹€!). λ‚΄κ°€ μ›ν•˜λŠ” νŒŒμΌμ„ 직접 μ°Έμ‘°ν•˜λ©΄ νŒŒμƒ 된 클래슀 뒀에 κΈ°λ³Έ ν΄λž˜μŠ€κ°€ μƒμ„±λœλ‹€λŠ” 것을 μ•Œμ•˜μŠ΅λ‹ˆλ‹€.

컴파일러 κ²½κ³ λŠ” 맀우 μ’‹μ§€λ§Œ μƒν˜Έ μ°Έμ‘° μ‹œλ‚˜λ¦¬μ˜€μ˜ μ°Έμ‘° 쀑 ν•˜λ‚˜λ₯Ό 방좜 μˆœμ„œλ‘œ ν”Œλž˜κ·Έ 지정할 수 있고 λ‹€λ₯Έ ν•˜λ‚˜λŠ” 선언을 λŒμ–΄ μ˜€κΈ°μœ„ν•œ κ²ƒμž…λ‹ˆλ‹€. μƒν˜Έ 방좜 μˆœμ„œ μ°Έμ‘°λŠ” 였λ₯˜μž…λ‹ˆλ‹€.

(ν˜„μž¬ Visual Studio / Typescript ν”„λ‘œμ νŠΈμ—μ„œ .js 포함 λͺ©λ‘μ„ μžλ™μœΌλ‘œ μƒμ„±ν•˜κΈ° μœ„ν•΄μ΄ κΈ°λŠ₯을 κ΅¬ν˜„ν–ˆμŠ΅λ‹ˆλ‹€ (λ””λ²„κ·Έν•˜κΈ° 쉬움).ν•˜μ§€λ§Œ μ½”λ“œλŠ” 인라인 μž‘μ—…μœΌλ‘œ C #에 μžˆμŠ΅λ‹ˆλ‹€. 곡유 ν•  수 μžˆλŠ”μ§€ λ¬Όμ–΄ λ³΄κ² μŠ΅λ‹ˆλ‹€. 기본적으둜 Tarjan의 CC μ•Œκ³ λ¦¬μ¦˜μ„ 두 번 μ‹€ν–‰ν•©λ‹ˆλ‹€.)

emit-orderκ°€ 잘λͺ»λ˜μ—ˆμ„ λ•Œ κ²½κ³ ν•˜κ³  λͺ…μ‹œμ μΈ μ§€μ‹œλ¬ΈμœΌλ‘œ emit-orderλ₯Ό μ•ˆμ •ν™”ν•˜λŠ” 것은 typescriptλ₯Ό λŒ€κ·œλͺ¨ ν”„λ‘œμ νŠΈμ—μ„œ μ‹€ν–‰ κ°€λŠ₯ν•œ μ–Έμ–΄λ‘œ λ§Œλ“œλŠ” 데 큰 도움이 될 κ²ƒμž…λ‹ˆλ‹€.

λ‚˜λŠ” 비ꡐ적 μž‘μ€ μ½”λ“œλ² μ΄μŠ€ (μ•½ 80 개의 .ts 파일)μ—μ„œμ΄ 문제λ₯Ό κ½€ 자주 λ°œμƒν•©λ‹ˆλ‹€. μ΄μƒμ μœΌλ‘œλŠ” λ‚΄ 파일의 맨 μœ„μ— <reference> νƒœκ·Έκ°€μ—†κ³  μ»΄νŒŒμΌλŸ¬κ°€μ΄ λͺ¨λ“  것을 처리 ν•  수 β€‹β€‹μžˆμŠ΅λ‹ˆλ‹€.

λ‚΄ μ•±μ—λŠ” 클래슀λ₯Ό μΈμŠ€ν„΄μŠ€ν™”ν•˜κ³  μ• ν”Œλ¦¬μΌ€μ΄μ…˜ (λ‚΄ μ»΄ν¬μ§€μ…˜ 루트)을 μ‹€ν–‰ν•˜λŠ” 파일이 1 개 뿐이고 ν™•μž₯을 μΆ”κ°€ν•˜λŠ” 파일 (예 : Array.prototype.distinct )이 λͺ‡ 개 있고 λ‚˜λ¨Έμ§€λŠ” 클래슀 / μΈν„°νŽ˜μ΄μŠ€ μ •μ˜μž…λ‹ˆλ‹€.

이 경우 λŒ€λΆ€λΆ„μ˜ μ½”λ“œλŠ” μž¬μ •λ ¬μ„μœ„ν•œ κ³΅μ •ν•œ κ²Œμž„μ΄λ©° μ˜¬λ°”λ₯΄κ²Œ μž‘λ™ν•˜κΈ° μœ„ν•΄ μˆ˜λ™μœΌλ‘œ <reference> μ •μ˜λ₯Ό μš”κ΅¬ν•΄μ„œλŠ” μ•ˆλ©λ‹ˆλ‹€. 클래슀 μ •μ˜λŠ” λͺ¨λ“  컴파일러 μž¬μ •λ ¬μ— λŒ€ν•œ κ³΅μ •ν•œ κ²Œμž„μœΌλ‘œ κ°„μ£Όλ˜λ©° κ²°ν•© 된 좜λ ₯의 맨 μœ„λ‘œ λΆ„λ₯˜λ˜μ–΄μ•Όν•˜λ©° λ‚˜λ¨Έμ§€ λͺ…령문은 μž…λ ₯ λ‹Ήμ‹œμ˜ μˆœμ„œλ₯Ό μœ μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

컴파일러 ν”Œλž˜κ·Έ --looseSorting κ°€ κ°€λŠ₯ν• κΉŒμš”? κ½€ 많이 μ°ΎλŠ” κΈ°λŠ₯인 것 κ°™μŠ΅λ‹ˆλ‹€.

ES6의 emit class-declarationμ—μ„œλŠ” 클래슀 μ„ μ–Έ 후에 정적 속성 할당을 μˆ˜ν–‰ν•©λ‹ˆλ‹€. μ΄λ ‡κ²Œν•˜λ©΄ 계산 된 속성 μ΄λ¦„μ˜ 클래슀 정적 속성 μ°Έμ‘°κ°€ μ •μ˜ μ „ μ‚¬μš©μ΄λ©λ‹ˆλ‹€.

λ‚΄ 보낸 JS :

class C {
    [C.p] () {}  // Use before definition
    [C.p+ C.e]() {}  // Use before definition
    [D.f] () {}  // Use before definition
}
C.p = 10;
C.e = 20;

class D {
}
D.f = "hi";

두 가지 κ²½μš°μ—λ§Œμ΄ 였λ₯˜μ— λŒ€ν•΄ κ²½κ³ ν•©λ‹ˆλ‹€. 계산 된 속성 이름은 클래슀 정적 속성을 μ°Έμ‘°ν•˜κ±°λ‚˜ κ·Έ μ•„λž˜μ— μ •μ˜ 된 λ‹€λ₯Έ 클래슀 인 속성을 μ°Έμ‘°ν•©λ‹ˆλ‹€.

였늘 μš°λ¦¬κ°€ 가지고 λ†€λ˜ μ‚¬μ†Œν•œ μ˜ˆλŠ” ν…ŒμŠ€νŠΈμ— ν¬ν•¨μ‹œν‚€κΈ° μœ„ν•΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

function f() {
    function g() {
        i = 10;
    }

    let i = 20;
    g();
}

의 μ‚¬μš© / μ •μ˜μ˜ μˆœμ—΄ 얻을 쒋은 것 g μ•½ i .

블둝 λ²”μœ„ λ‚΄μ—μ„œ μ •μ˜ 된 ν•¨μˆ˜μ— λŒ€ν•΄ μƒκ°ν•˜λŠ” 것을 μžŠμ§€ λ§ˆμ‹­μ‹œμ˜€. 그것은 JavaScript ν‘œμ€€μ— 따라 μ •μ˜λ˜μ§€ μ•Šμ€ λ™μž‘μ΄λ©° 적어도 Firefox와 Chrome은 κ΅¬ν˜„μ— λ™μ˜ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

예 :

function f() {
    if (true) {
        g(); // iirc, g executes in Chrome, and is undefined in Firefox
        function g() {
        }
        g(); // works in both browsers
    }
}

μ§€κΈˆ https://github.com/Microsoft/TypeScript/issues/2854μ—μ„œ μΆ”μ ν•©λ‹ˆλ‹€.

였늘 μš°λ¦¬κ°€ 이것에 λ¬Ό λ Έκ³  무슨 일이 μΌμ–΄λ‚˜κ³  μžˆλŠ”μ§€ μ•Œμ•„λ‚΄λŠ” 데 μ‹œκ°„μ΄ κ±Έλ ΈμŠ΅λ‹ˆλ‹€.

TypeScript v1.8.10, Webpack 기반 λΉŒλ“œ, κΈ°λ³Έ 및 νŒŒμƒ 클래슀 λͺ¨λ‘ λ™μΌν•œ νŒŒμΌμ— μ •μ˜λ˜μ—ˆμ§€λ§Œ (λΆ„λͺ…νžˆ) 잘λͺ»λœ μˆœμ„œλ‘œ, 컴파일 였λ₯˜λ‚˜ κ²½κ³ κ°€ μ—†μœΌλ©°, μ†ŒμŠ€ 맡이 μž‘λ™ν•˜λŠ” κ²½μš°μ—λ„ 였λ₯˜ 호좜 μŠ€νƒμ΄ 맀우 μœ μš©ν•˜μ§€ μ•Šμ€ μœ„μΉ˜ (νŒŒμƒ 된 μœ„μΉ˜λ₯Ό κ°€μ Έ μ˜€λŠ” λ‹€λ₯Έ 클래슀의 끝).

전체 λ…Όμ˜λ₯Ό κ±°μΉ˜μ§€λŠ” μ•Šμ§€λ§Œ 응급 처치둜 컴파일러 κ²½κ³ κ°€ 도움이 될 것 κ°™μŠ΅λ‹ˆλ‹€. 2 Β’

TS가이 κΈ°λŠ₯을 기본적으둜 μ§€μ›ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” 것은 어리석은 μΌμž…λ‹ˆλ‹€. 그것이 μ•ΌκΈ°ν•˜λŠ” ν˜Όλž€μ€ ν‘œμ€€ JSλ₯Ό μ‚¬μš©ν•˜λŠ” 것과 μœ μ‚¬ν•©λ‹ˆλ‹€. λ˜ν•œ, 가상 방법, λˆ„κ΅¬?

@MrGuardian OP에 μ„€λͺ… 된 μž¬ν˜„μ΄ μˆ˜μ •λ˜μ—ˆμŠ΅λ‹ˆλ‹€. μƒˆλ‘œμš΄ 문제 λ˜λŠ” ν˜„μž¬ κ²ͺκ³ μžˆλŠ” 문제λ₯Ό 더 잘 μ„€λͺ…ν•˜λŠ” κΈ°μ‘΄ 문제λ₯Ό λͺ…ν™•νžˆ ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?

(# 12673) λ‹€μŒμ€ IMOκ°€ 였λ₯˜ μ—¬μ•Όν•˜λŠ” 또 λ‹€λ₯Έ 두 가지 κ²½μš°μž…λ‹ˆλ‹€.

````
클래슀 ν…ŒμŠ€νŠΈ
{
_b = this._a; // μ •μ˜λ˜μ§€ μ•ŠμŒ, 였λ₯˜ / κ²½κ³  μ—†μŒ
_a = 3;

static _B = Test._A; // undefined, no error/warning
static _A = 3;

method()
{
    let a = b; // Block-scoped variable 'b' used before its declaration
    let b = 3;
}

}
````

@Spongman 은 λ³„λ„μ˜ λ¬Έμ œμ—

12673

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