Typescript: ์ƒ์„ฑ์ž์— ๋Œ€ํ•œ ๊ฐ€์‹œ์„ฑ ํ—ˆ์šฉ

์— ๋งŒ๋“  2015๋…„ 03์›” 13์ผ  ยท  42์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: microsoft/TypeScript

ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ์™€์ด ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๊ฐ€ ๋น„๊ณต๊ฐœ์ด๋ฏ€๋กœ ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ•œ ํด๋ž˜์Šค๋ฅผ ์ธ์Šคํ„ด์Šคํ™” ํ•  ์ˆ˜์—†๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ผ๋ฐ˜์ ์ธ ํŒจํ„ด์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

Fixed Suggestion help wanted

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

ํด๋ž˜์Šค์˜ ๊ฐœ์ธ ํ•จ์ˆ˜์—๋„ ๋˜‘๊ฐ™์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ฐœ์ธ ์ƒ์„ฑ์ž์— ์•ก์„ธ์Šค ํ•  ๋•Œ ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋ฅผ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

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

๋ชจ๋“  "ํด๋ž˜์Šค"๋Š” ์‹ค์ œ๋กœ ํ•จ์ˆ˜์ผ ๋ฟ์ด๋ฉฐ ํ˜ธ์ถœ ํ•  ์ˆ˜์—†๋Š” ํ•จ์ˆ˜๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ํด๋ž˜์Šค๊ฐ€ ๋ณด์ด๋Š” ๋ชจ๋“  ๊ณณ์—์„œ new ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ํด๋ž˜์Šค๋ฅผ ๊ณต๊ฐœํ•˜์ง€ ์•Š๊ณ  (์˜ˆ : ๋ชจ๋“ˆ์—์„œ) ํด๋ž˜์Šค์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ํด๋ž˜์Šค๋ฅผ ํ™•์žฅ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋‚จ์šฉํ•˜์ง€๋งŒ ์ง์ ‘ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๊ฑฐ๋‚˜ ํ™•์žฅ ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

ํด๋ž˜์Šค์˜ ๊ฐœ์ธ ํ•จ์ˆ˜์—๋„ ๋˜‘๊ฐ™์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ฐœ์ธ ์ƒ์„ฑ์ž์— ์•ก์„ธ์Šค ํ•  ๋•Œ ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋ฅผ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@billccn "JS๊ฐ€ ํ—ˆ์šฉํ•˜๋ฉด ์ˆจ๊ธธ ์ˆ˜ ์—†๊ฒŒ๋ฉ๋‹ˆ๋‹ค"๋ผ๋Š” ์š”์ฒญ์„ ์ฃฝ์ด๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์‚ฌ๋ฌผ์€ TS ๋ฐ ์ƒ์„ฑ JS์—์„œ ์™„์ „ํžˆ ๋ณดํ˜ธํ•˜๊ณ  ๋‹ค๋ฅธ ๊ฒƒ์€ JS ์ƒ์„ฑ ์ง€์ ๊นŒ์ง€ ๋ณดํ˜ธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์„ค๋ช…ํ–ˆ๋“ฏ์ด ์™„์ „ํ•œ ๋ณดํ˜ธ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ๋‹ค๋ฅธ ๊ฐ€์‹œ์„ฑ์„ ํ™•์ธํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€๋Šฅํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
๊ฐ€์‹œ์„ฑ ์ˆ˜์ •์ž๊ฐ€ ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์œผ๋ฉด ๋ชจ๋“  ๊ณณ์—์„œ ๊ธฐ๋ณธ ๊ณต๊ฐœ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น ๊ฐœ๋…์ด ์œ ์šฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๋‹ค๋ฅธ ๋„๊ตฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ, ๊ฐœ์ธ ํ•„๋“œ๊ฐ€ ์ปดํŒŒ์ผ๋Ÿฌ ๊ฒ€์‚ฌ๋กœ๋งŒ ๊ตฌํ˜„๋˜๋ฉด ์ƒ์„ฑ์ž๋กœ ํ™•์žฅ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ๋ฐ˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ์ด๋ฏธ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

: +1 : ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๊ฐ•์ œํ•˜๊ณ  ์‹ถ์„ ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ๋ฐ˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ์ฝ”๋“œ์— ๋งŽ์€ ๋…ธ์ด์ฆˆ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ๊ฒ€์‚ฌ๊ฐ€ ๊ฐˆ ๊ธธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ˆ˜๋ฝ ๋จ, PR ์ˆ˜๋ฝ

๋ช…ํ™•ํžˆํ•˜๊ธฐ ์œ„ํ•ด private ์ƒ์„ฑ์ž๊ฐ€์žˆ๋Š” ํด๋ž˜์Šค๋ฅผ ํ™•์žฅ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ฆ‰ ์ด๊ฒƒ์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๊นŒ?

class A {
    private constructor() {
    }
}

class B extends A { // Should there be an error at A saying: "Cannot extend private class 'A'"?
}

๊ทธ๋ ‡๋‹ค๋ฉด ๋‹ค์Œ์„ ํ—ˆ์šฉํ• ๊นŒ์š”?

class A {
    protected constructor(a?: any)
    private constructor() {

    }
}

class B extends A { // No error since 'A' has a non-private constructor
}

๋น„ JS ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜์—์„œ ์˜ˆ์ƒ๋˜๋Š” ๋™์ž‘์ž…๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ ์˜ˆ์—์„œ B ๋Š” ์•”์‹œ ์  ์Šˆํผ ํ˜ธ์ถœ์ด ๋ถˆ๋ฒ•์ด๋ฏ€๋กœ ์˜ค๋ฅ˜ ์—ฌ์•ผํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ private constructor ๊ฐ€์žˆ๋Š” ํด๋ž˜์Šค๋Š” ์‚ฌ์‹ค์ƒ sealed / final ์ž…๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ์˜ˆ์ œ์—์„œ A ์˜ ์„ ์–ธ์€ ์ƒ์„ฑ์ž์˜ ๋ชจ๋“  ์˜ค๋ฒ„๋กœ๋“œ์™€ ๊ทธ ๊ตฌํ˜„์ด ๋™์ผํ•œ ๊ฐ€์‹œ์„ฑ์„ ๊ฐ€์ ธ์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜ ์—ฌ์•ผํ•ฉ๋‹ˆ๋‹ค (๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ๋™์ผํ•œ ๊ทœ์น™).

# 471๋„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ์ƒ์„ฑ์ž๋ฅผ ๋น„๊ณต๊ฐœ๋กœ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ •๋ง๋กœ ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ๋ณดํ˜ธ ๋ ๊นŒ์š”?

@benliddicott ๋•Œ๋กœ๋Š” ๋” ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹จ์ผ ํ•ญ๋ชฉ์„ ๊ฐ•์ œ๋กœ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ •์  ๋ฉ”์„œ๋“œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ์ฒด๋ฅผ ๋งŒ๋“ค๋„๋ก ๊ฐ•์ œํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ๋ฅผ๋ณด์‹ญ์‹œ์˜ค .

@dsherret protected ๋Š” ์ด๋Ÿฌํ•œ ๋ชจ๋“  ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‹ค์šด ์ŠคํŠธ๋ฆผ ์‚ฌ์šฉ์ž๊ฐ€ ํด๋ž˜์Šค์—์„œ ์ƒ์†ํ•ด์•ผํ•˜๋Š” ํ•ฉ๋ฒ•์  ์ธ ํ•„์š”์„ฑ์ด ์ „ํ˜€ ์—†๋‹ค๋Š” ๊ฒƒ์„ ํ™•์‹  ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. private ์˜ ์œ ์ผํ•œ ํšจ๊ณผ๋Š” ๋‹ค์šด ์ŠคํŠธ๋ฆผ ์‚ฌ์šฉ์ž๊ฐ€ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์š”๊ตฌ๋ฅผ ์ถฉ์กฑํ•˜์ง€ ๋ชปํ•˜๋„๋กํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@benliddicott ๋•Œ๋•Œ๋กœ ๋‹น์‹ ์ด ์›ํ•˜๋Š” ์œ ์ผํ•œ ๊ฒƒ์€ ํด๋ž˜์Šค๊ฐ€ ํ™•์žฅ

"2. ํด๋ž˜์Šค๋ฅผ ํ™•์žฅ ํ•  ์ˆ˜ ์—†๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒํ•˜๋ฉด ๋ถ€์ฃผ์˜ํ•˜๊ฑฐ๋‚˜ ์•…์˜์  ์ธ ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ๊ฐ์ฒด์˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜์—ฌ ํด๋ž˜์Šค์˜ ๋ถˆ๋ณ€์˜ ๋™์ž‘์„ ์†์ƒ์‹œํ‚ค๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ํด๋ž˜์Šค๋ฅผ ์ตœ์ข… ํด๋ž˜์Šค๋กœ ์„ค์ •ํ•˜์—ฌ ํ•˜์œ„ ํด๋ž˜์Šค ์ง€์ •์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ๋…ผ์˜ ํ•  ๋Œ€์•ˆ์ž…๋‹ˆ๋‹ค.

ํ˜„์žฌ TypeScript์—๋Š” final / sealed ์ง€์›์ด ์—†์œผ๋ฏ€๋กœ private ์ƒ์„ฑ์ž๋Š” ์œ ํ˜• ์‹œ์Šคํ…œ์˜ ๊ด€์ ์—์„œ ๋ณ€๊ฒฝํ•  ์ˆ˜์—†๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“œ๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. (ํ•˜์ง€๋งŒ ์ƒ์„ฑ์ž์—์„œ ๊ฐ์ฒด๋ฅผ ๊ณ ์ •ํ•˜๋Š” ๊ฒƒ๋„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.)

@billccn , ๊ทธ ์ €์ž์˜ ์˜๊ฒฌ์€ ํฅ๋ฏธ ๋กญ์Šต๋‹ˆ๋‹ค. ๋„์„œ๊ด€ ์ž‘์„ฑ์ž์˜ ์˜๊ฒฌ์ด ๋„์„œ๊ด€ ์ด์šฉ์ž์˜ ์˜๊ฒฌ๋ณด๋‹ค ์šฐ์„ ํ•ด์•ผํ•œ๋‹ค๋Š” ์ƒ๊ฐ๋„ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ๋‚ด ๊ฒฝํ—˜์— ๋”ฐ๋ฅด๋ฉด ๋„์„œ๊ด€ ์ž‘์„ฑ์ž๋Š” ๋น„๊ณต๊ฐœ๋กœ ์‚ฌ์šฉํ•  ๋•Œ๋ฅผ ๋ชจ๋ฅด๊ณ  ๊ณผ๋„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ณจ์นซ๊ฑฐ๋ฆฌ๋ฅผ ์œ ๋ฐœํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๋•Œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ ๋ ์ง€ ์•Œ๊ณ  ์žˆ๋‹ค๊ณ  ๋ฏฟ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ Java์™€ ๊ฐ™์€ ์ •์  ์–ธ์–ด๋ณด๋‹ค ๋” ์ ์ ˆํ•œ ๋น„๊ต๋Š” ๋‹ค๋ฅธ ๋™์  ์–ธ์–ด ์ธ Perl์ž…๋‹ˆ๋‹ค. http://www.perlmonks.org/?node_id=437623

perl์— public, private, protected์™€ ๊ฐ™์€ ์•ก์„ธ์Šค ์ˆ˜์ •์ž๊ฐ€์—†๋Š” ์ด์œ  ์ค‘ ํ•˜๋‚˜๋Š” ์ข…์ข… ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ๋ฐฉํ•ด๊ฐ€๋˜๋Š” ๊ฒƒ์œผ๋กœ ์ธ์‹๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์›๋ž˜ ๋””์ž์ด๋„ˆ๊ฐ€ ๊ตฌ์ƒ ํ•œ ๊ฒƒ์€ ์•„๋ฌด ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์œผ๋กœ ๋ฌด์—‡์„ํ•˜๊ณ  ์‹ถ์€์ง€. ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์œ ์—ฐ์„ฑ์„ ๊ณ ๋ คํ•œ ์„ค๊ณ„-์ง€๊ธˆ์€ ํ•„์š”ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๋‹ค์Œ ์‚ฌ๋žŒ์€ ์ƒˆ๋กœ์šด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋งค์šฐ ํŽธ๋ฆฌํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์œ ์—ฐ์„ฑ์„ ๊ฐœ๋ฐœ ํ•œ ์ฒœ์žฌ์„ฑ์„ ์ถ•๋ณต ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค ;-)

๊ณผ:

Perl์€ ๊ฐœ์ธ ์ •๋ณด ๋ณดํ˜ธ์— ์—ด๊ด‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฐํƒ„ ์ด์ด์žˆ์–ด์„œ๊ฐ€ ์•„๋‹ˆ๋ผ ์ดˆ๋Œ€๋ฐ›์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฑฐ์‹ค์—์„œ ๋‚˜๊ฐ€๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

http://www.perlmonks.org/?node_id=1096925

์‚ฌ์‹ค JavaScript๋Š” ๋™์ผํ•˜๋ฉฐ-์˜ˆ-TypeScript๋Š” ๊ฑฐ์˜ ๋ชจ๋“ ๋ฉด์—์„œ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. typescript์—์„œ๋Š” ์ ์ ˆํ•œ ์ด๋ฆ„์˜ escape-hatch : obj["propertyName"] ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ์ธ ๋ฉค๋ฒ„์— ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž‘์„ฑ์ž๋กœ์„œ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ๊ฐ์ฒด์—์„œ ์ƒ์†ํ•˜๋Š” ๊ฒƒ์ด ํ˜„๋ช…ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋ฉด ์‚ฌ์šฉ์ž์—๊ฒŒ ํ˜„๋ช…ํ•˜์ง€ ์•Š๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋“ค์„ ๋ง‰์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๊ทธ๋“ค์€ ๊ฒฐ๊ตญ ๋‹น์‹ ๋ณด๋‹ค ๋” ์ž˜ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” "์ถฉ๋ถ„ํ•œ ๋ณดํ˜ธ"์— ๋Œ€ํ•œ ๋…ผ์˜๋ฅผ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. TS์— ๊ฐ€์‹œ์„ฑ์˜ ๊ฐœ๋…์ด ์žˆ๊ณ ์ด ๊ฐœ๋…์„ ์ƒ์„ฑ์ž์—๊ฒŒ ์ ์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋Œ€๋‹ต์€ "์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค"์ž…๋‹ˆ๋‹ค.

์ƒ์„ฑ์ž์—์„œ ์•ก์„ธ์Šค ์ˆ˜์ •์ž๊ฐ€ ํ—ˆ์šฉ๋˜๋ฉด ๋‹ค๋ฅธ ์ˆ˜์ • ์ž์™€ ์ผ๊ด€๋œ ๋™์ž‘์„ ๊ฐ€์ ธ์•ผํ•˜๊ณ  ๋น„๊ณต๊ฐœ๋ฅผ ํ—ˆ์šฉํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐœ์ธ ํšŒ์›์€ ํ™•์‹คํžˆ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ํด๋ž˜์Šค ์™ธ๋ถ€์˜ ๋ถ€์ž‘์šฉ์„ ๊ฑฑ์ •ํ•˜์ง€ ์•Š๊ณ  ํด๋ž˜์Šค์˜ ๊ตฌํ˜„ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  ๋ฆฌํŒฉํ† ๋ง ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ์ธ ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŒ€์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ํŠน์ • ๋ฐฉ์‹์œผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๋„๋ก ๊ฐ•์ œํ•˜๊ณ  ์‹ถ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋” ์ฝ๊ธฐ ์‰ฝ๊ณ ์ด ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•˜์ง€ ์•Š๋„๋ก ๊ฐ•์ œํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์—์„œ ์ •์  ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๊ฐ•์ œํ•˜๊ณ  ์‹ถ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

class Currency {
    private constructor(private value: number, private type: CurrencyType) {
    }

    static fromNumberAndType(value: number, type: CurrencyType) {
        return new Currency(value, type);
    }

    static fromString(str: string) {
        const value = ...,
              type  = ...;

        return new Currency(value, type);
    }

    // ... omitted ...
}

// error:
const badCurrency = new Currency(5.66, CurrencyType.USD);
// ok:
const goodCurrency1 = Currency.fromNumberAndType(5.66, CurrencyType.USD);
const goodCurrency2 = Currency.fromString("5.66 USD");

๊ฐœ์ธ ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŒ€์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ํŠน์ • ๋ฐฉ์‹์œผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๋„๋ก ๊ฐ•์ œ ํ•˜๊ณ  ์‹ถ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Š” ์–ธ์–ด ๋””์ž์ธ ๋ฌธ์ œ๊ฐ€ ์•„๋‹Œ ๊ด€๋ฆฌ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

@benliddicott ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์œ ํ˜• ์„ค๋ช…์ž์— ๋Œ€ํ•ด ๋น„์Šทํ•œ ๋ง์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. :) ๊ธฐ๋Šฅ์ด ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์œผ๋ฉด ์ผ๋ฐ˜ JS๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ๋˜๋Š”
TS๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ƒ์„ฑ์ž์—์„œ private ์‚ฌ์šฉ์„ ๊ธˆ์ง€ํ•˜๋Š” ๋ฆฐํŠธ์™€ ์œ ์‚ฌํ•œ ๊ทœ์น™์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ์ฃผ์„์„ ๋‹ค๋ฅธ ๋ง๋กœ ๋ฐ”๊พธ๋ ค๋ฉด "์–ธ์–ด ๋””์ž์ธ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ ๋„๊ตฌ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค".

@benliddicott ๋ญ”๊ฐ€ ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ํ•œ ํ›„ ์ž˜๋ชป๋˜์—ˆ์„ ๋•Œ ๋‹ค์‹œ ๋ณด๋‚ผ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ„์ด ์ ˆ์•ฝ๋ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ์ •ํ™•ํžˆ ์•Œ๋ ค์ฃผ๋Š” ๊ฒƒ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ•  ๋•Œ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ ์ ˆํ•œ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•˜๋Š” ์ž์‚ฐ์ž…๋‹ˆ๋‹ค.

@dsherret ์•„๋‹ˆ์š” Architecture astronauts ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋Š” ์ž„์˜์˜ ์ œ์•ฝ ์กฐ๊ฑด์ž…๋‹ˆ๋‹ค. : -1 :

@jbondc ์ด "๊ฑด์ถ• ์šฐ์ฃผ ๋น„ํ–‰์‚ฌ"๊ฐ€ ํ•ฉ๋ฆฌ์ ์ธ ์ฃผ์žฅ์ž…๋‹ˆ๊นŒ? ์ด ๊ธฐ๋Šฅ์„ ์›ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์„ ๋ถˆ์พŒํ•˜๊ฒŒํ•˜๊ฑฐ๋‚˜ ์นญ์ฐฌํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๊นŒ?

@jbondc "๊ฑด์ถ• ์šฐ์ฃผ ๋น„ํ–‰์‚ฌ"๋ผ๋Š” ์šฉ์–ด๊ฐ€ ์—ฌ๊ธฐ์— ๊ด€๋ จ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์•„ํ‚คํ…์ฒ˜์— ๋Œ€ํ•ด ์ƒ๊ฐ ํ•˜๋Š” ๋ฐ

๋˜ํ•œ ์ฝ”๋“œ์˜ ์˜ค์šฉ์„ ๋ฐฉ์ง€ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— "์ž„์˜"๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๋‚˜๋Š” ๋‚˜ ์ž์‹ ์ด๋‚˜ ์šฐ๋ฆฌ ํŒ€์ด ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋Œ€์‹  ์ •์  ๋ฉ”์„œ๋“œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ •์  ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹ฑ๊ธ€ ํ†ค์„ ๊ฐ•์ œ๋กœ ์‚ฌ์šฉํ•˜๋„๋ก ์ƒ๊ธฐ์‹œํ‚ค๊ณ  ์‹ถ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋น ๋ฅด๊ณ  ๊ฐ„๋‹จํ•˜๋ฉฐ ์ปดํŒŒ์ผ๋Ÿฌ๋กœ๋ถ€ํ„ฐ ์ ์ ˆํ•œ ํ”ผ๋“œ๋ฐฑ์„๋ฐ›์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์ž„์˜์ ์ด๋ผ๋ฉด ์–ธ์–ด์˜ ๋งŽ์€ ์ธก๋ฉด์ด ์ž„์˜์ ์ด๋ผ๊ณ  ์ฃผ์žฅ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜๊ฒฌ์— ํ‘œํ˜„ํ•˜์ง€ ์•Š์€ ๊ฒƒ์ด ์ž„์˜์ ์ด๋ผ๋Š” ์ ์— ๋Œ€ํ•ด ๋” ๋งŽ์ด ๋งํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด๊ฒƒ์€ ์‚ฌ๋žŒ๋“ค์ด ์‹ซ์–ดํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ๊ฐ„๋‹จํ•œ ์–ธ์–ด ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

@dsherret ๋‹ค๋ฅธ ์ œ์•ฝ์„ ์ ์šฉํ•˜๋Š” ๋Œ€์‹  ๋ฌธ์„œํ™”ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

๋‹ค์ค‘ ์ƒ์†์„ ์ƒ๋‹นํžˆ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. # 4805๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค (์ง€๊ธˆ ๋‹น์žฅ์€ ๋‚˜์ค‘์— ์ƒ๊ฐํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค). ๋‚˜๋Š” ์ด๋ฏธ # 3578์—์„œ ๋‚ด ์ƒ๊ฐ์˜ ์ผ๋ถ€๋ฅผ ํ‘œํ˜„ ํ–ˆ์œผ๋ฏ€๋กœ ๋‹ค์‹œ๋Š” ๊ทธ๊ฒƒ์„ ๊ท€์ฐฎ๊ฒŒํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. astronaut ๋กœ ์•ฝ๊ฐ„ ๊ฐ•ํ•˜๊ฒŒ ๋‚˜์™”์œผ๋‹ˆ, ๋ˆ„๊ตฌ์—๊ฒŒ๋„ ๊ธฐ๋ถ„์„ ์ƒํ•˜๊ฒŒํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

๊ฐœ์ธ ์ƒ์„ฑ์ž๊ฐ€์žˆ๋Š” @jbondc ํด๋ž˜์Šค๋Š” ์ƒ์† ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์€ ๋ณธ์งˆ์ ์œผ๋กœ ๋ด‰์ธ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๋‹ค์ค‘ ์ƒ์†์€ ๋งํ•  ๊ฒƒ๋„์—†๊ณ  ์ƒ์†๋„ ์ด๊ฒƒ๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ๋ฅผ ์™ธ๋ถ€ ์ ์œผ๋กœ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜ ์ฃผ์„์œผ๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ž์ฒด ๋ฌธ์„œํ™” ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์ข‹์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ œ๊ฐ€ TypeScript์˜ ๋ชจ๋“  ์ œํ•œ ์‚ฌํ•ญ์„ ์ข‹์•„ํ•˜๋Š” ์ด์œ  ์ค‘ ํ•˜๋‚˜์ด๋ฉฐ ๊ธฐ๋ณธ์ ์œผ๋กœ์ด ๊ธฐ๋Šฅ์—์„œ ์šฐ๋ฆฌ๊ฐ€ ์š”๊ตฌํ•˜๋Š” ๊ฒƒ์€ ์–ธ์–ด ์ž์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๋ฌธ์„œํ™”ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ์˜ˆ์ œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

module Currency {
    export enum Type {
        CAD = 1.3,
        USD = 1,
    }

    class PrivateCurrency {
        constructor(private value: number, private type: Type) { }
    }

    export function fromNumberAndType(value: number, type: Type) {
        return new PrivateCurrency(value, type);
    }

    export function fromString(str: string) {
        let value = 10;
        let type = Type.CAD;
        return new PrivateCurrency (value, type);
    }
}

๋œ OO-ish์ด์ง€๋งŒ ์‹ค์ œ๋กœ '์ง„์งœ'์‹ค์ œ ๊ฐœ์ธ ์ˆ˜์—…์ด ์žˆ์Šต๋‹ˆ๋‹ค.

@jbondc ๊ฐœ์ธ ์ˆ˜์—…์„์œ„ํ•œ ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹ (๊ฐœ์ธ ์ƒ์„ฑ์ž๊ฐ€์žˆ๋Š” ๋‚ด๋ณด๋‚ด๊ธฐ ๊ฐ€๋Šฅํ•œ ํด๋ž˜์Šค)์„ ์‚ฌ์šฉํ•˜๋„๋กํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ๊ทธ๋ฃน A์˜ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๊ณ  ๊ทธ๋ฃน B ์ž‘์—…์„ ๋ฐฉํ•ดํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ์ด ์žˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. :)

+1

+1

์—ฌ์ „ํžˆ ๋ ˆ์ด๋”์— ์žˆ์Šต๋‹ˆ๊นŒ? ํ™๋ณด๋Š” ์ •๋ง ์˜ค๋ž˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค!

+1

+1

+1

: +1 : ํŒฉํ† ๋ฆฌ ๋””์ž์ธ ํŒจํ„ด์— ์œ ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋ฐ˜๋ณต๋˜๊ฑฐ๋‚˜ ํŒŒํ‹ฐ์— ๋Šฆ๋Š” ๊ฒฝ์šฐ ์‚ฌ๊ณผํ•˜์ง€๋งŒ ๊ฐœ์ธ ์ƒ์„ฑ์ž๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

interface ExampleBuilder {
    Instance(): Example;
}

export interface Example {
    Val(): number;
}

export let Example: ExampleBuilder = class ExampleImpl {
    constructor(v: number) {
    }

    Val(): number {
        return 42;
    }

    static Instance(): Example {
        return new ExampleImpl(2);
    }
};

let x = Example.Instance(); // OK: x has type Example
let y = new Example(5);     // ERROR: Cannot use 'new' with an expression whose type lacks a call or construct signature.

์ตœ๊ทผ์— ๋ณ‘ํ•ฉ ๋œ readonly ์ˆ˜์ •์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋” ๋งŽ์ด ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@myitcv ์ง€๊ธˆ์€ ๊ทธ๊ฒƒ์„ ์‹œํ–‰ํ•˜๊ธฐ์— ๊ฝค ๋ฉ‹์ง€๋‹ค ... ์•„๋งˆ๋„ ๋‚ด ์ƒ๊ฐ์— ์–ธ๊ธ‰ ๋œ ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ• ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ์—ฌ์ „ํžˆ ๋„ˆ๋ฌด ์žฅํ™ฉํ•˜๊ณ  ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋ช‡ ์ดˆ๊ฐ€ ๊ฑธ๋ฆฌ๋ฏ€๋กœ ์•ก์„ธ์Šค ์ˆ˜์ •์ž๊ฐ€ ์ƒ์„ฑ์ž์—์„œ ์—ฌ์ „ํžˆ ๋งค์šฐ ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ, ๋‚˜๋Š” ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  // todo: make private once supported ์ฃผ์„์œผ๋กœ ๋ฏธ๋ž˜์˜ ๋ชจ๋“  ๊ฐœ์ธ ์ƒ์„ฑ์ž๋ฅผ ํ‘œ์‹œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์ด ์ œ๊ณต๋˜๋ฉด ์•ก์„ธ์Šค ์ˆ˜์ •์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๋ถ€ ์‹œํ–‰ ๋ฐ ๋” ๋‚˜์€ ๋ฌธ์„œํ™”๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฟก๋ฟก

๊ทธ๋ž˜๋„ ์—ฌ์ „ํžˆ ๋„ˆ๋ฌด ์žฅํ™ฉํ•˜๊ณ  ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋ช‡ ์ดˆ๊ฐ€ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํด๋ž˜์Šค๋Š” ์ฝ”๋“œ๊ฐ€ ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์—์ธ์ง€ ๋ถ€ํ•˜๋กœ ์ธํ•ด ํฐ ๊ณ ํ†ต์„๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ”„๋กœ๊ทธ๋ž˜๋จธ์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์‹ค์ œ๋กœ ํ›Œ๋ฅญํ•˜๊ณ  ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

https://github.com/Microsoft/TypeScript/pull/6885์— ์˜ํ•ด ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค @AbubakerB!

์•ˆ๋…•ํ•˜์„ธ์š”,์ด ๊ธฐ๋Šฅ์€ ํ–ฅํ›„ ๋ฒ„์ „์˜ typescript์—์„œ ์ถœ์‹œ ๋  ์˜ˆ์ •์ž…๋‹ˆ๊นŒ?
ํ˜„์žฌ ๊ฐœ์ธ ๋˜๋Š” ๋ณดํ˜ธ ์ƒ์„ฑ์ž๋ฅผ ์„ ์–ธํ•˜๋ ค๊ณ ํ•˜๋ฉด typescript 1.8.10์—์„œ์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
์˜ค๋ฅ˜ TS1089 : 'private'์ˆ˜์ •์ž๋Š” ์ƒ์„ฑ์ž ์„ ์–ธ์— ๋‚˜ํƒ€๋‚  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์•„, ์‹ ๊ฒฝ ์“ฐ์ง€ ๋งˆ. ์ด ๊ธฐ๋Šฅ์ด typescript 2.0์— ํฌํ•จ๋  ๊ฒƒ์ด๋ผ๋Š” ๋กœ๋“œ๋งต์„ ๋ฐฉ๊ธˆ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

์•„, ์‹ ๊ฒฝ ์“ฐ์ง€ ๋งˆ. ์ด ๊ธฐ๋Šฅ์ด typescript 2.0์— ํฌํ•จ๋  ๊ฒƒ์ด๋ผ๋Š” ๋กœ๋“œ๋งต์„ ๋ฐฉ๊ธˆ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๋งˆ์ผ์Šคํ†ค์ด TypeScript 2.0 ๋กœ ์„ค์ •๋˜๊ณ  ๋ ˆ์ด๋ธ” Fixed ๋Š” ํฌํ•จ๋˜์—ˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๋ ˆ์ด๋ธ”์ด Fixed ์ผ๋ฐ˜์ ์œผ๋กœ ๋งˆ์Šคํ„ฐ์— ํฌํ•จ๋˜๋ฉฐ npm install typescript@next ๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

TypeScript 2.0.2 RC๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ private ์ƒ์„ฑ์ž๋ฅผ ๋งŒ๋“ค๋ ค๊ณ  ํ•  ๋•Œ ์—ฌ์ „ํžˆ TS1089๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ž˜๋ชปํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๋‹จ์ˆœํžˆ ์ˆ˜์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๊นŒ?

TypeScript 2.0.2 RC๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๊ฐœ์ธ ์ƒ์„ฑ์ž๋ฅผ ๋งŒ๋“ค๋ ค๊ณ  ํ•  ๋•Œ ์—ฌ์ „ํžˆ TS1089๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ž˜๋ชปํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๋‹จ์ˆœํžˆ ์ˆ˜์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๊นŒ?

๊ทธ๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ช…๋ น ๋ณ„์นญ์ด ์˜ฌ๋ฐ”๋ฅธ ๋ฒ„์ „์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š”์ง€, ํŽธ์ง‘๊ธฐ๊ฐ€ ์ตœ์‹  TS ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋„๋ก ์—…๋ฐ์ดํŠธ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

๋‚˜๋Š” ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ๋‹ค. ๊ทธ๊ฒƒ์€์˜ ์ž˜๋ชป gulp-typescript ์˜ ์ž˜๋ชป๋œ ๋ฒ„์ „ ์‚ฌ์šฉ ๋œ tsc ๋‚ด ์‚ฌ์–‘์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  package.json ์™€ ๋ฌด์—‡์— ํ•ด๊ฒฐ ๋œ PATH .

์ด ๋ฌธ์ œ๊ฐ€์žˆ๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ์„ ์œ„ํ•ด ๋‚ด ํ•ด๊ฒฐ์ฑ…์€ gulpfile.js ๋ฅผ ํŽธ์ง‘ํ•˜๋Š” ๊ฒƒ์ด ์—ˆ์Šต๋‹ˆ๋‹ค.

  1. ๋‹ค์Œ๊ณผ ๊ฐ™์ด gulp-typescript ์•ž์— require TypeScript :
// Tool-Chain: Scripts
var tsc = require("typescript");
var typescript = require('gulp-typescript');
  1. ๋นŒ๋“œ ์ž‘์—…์„ ์ •์˜ ํ•  ๋•Œ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์žฌ์ •์˜๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
// Task(s): Build TypeScript Outputs
var tsconfig = typescript.createProject("path to tsconfig", { typescript: tsc });
gulp.task('build:scripts', function () {
    let ts = tsconfig.src()
                     .pipe(sourcemaps.init())
                     .pipe(typescript(tsconfig));

    return ts.js.pipe(sourcemaps.write(".")).pipe(gulp.dest(path.join(outputs.root, outputs.scripts)))
});
์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰