Typescript: ๋ถ€๋ถ„ ์ˆ˜์—…

์— ๋งŒ๋“  2014๋…„ 08์›” 29์ผ  ยท  224์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: microsoft/TypeScript

๋ถ€๋ถ„ ํด๋ž˜์Šค ์ง€์›์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. Mixins ๋Š” ๋Ÿฐํƒ€์ž„ ๊ตฌํ˜„์ด๊ธฐ ๋•Œ๋ฌธ์— ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. typescript๋ฅผ javascript๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์ „์— ๋ถ€๋ถ„ ํด๋ž˜์Šค๊ฐ€ ํ•˜๋‚˜๋กœ ๊ฒฐํ•ฉ๋˜๋Š” ์ปดํŒŒ์ผ ๊ตฌํ˜„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

//FileA.ts
partial class ClassA
{      
    constructor(public name: string) {}
    public sayHello(): string { return "hi!"; }
}

//FileB.ts
partial class ClassA
{
   public sayBye(): string { return "by!"; }
}

๋ ๊ฑฐ์•ผ:

partial class ClassA
{      
    constructor(public name: string) {}
    public sayHello(): string { return "hi!"; }
    public sayBye(): string { return "by!"; }
}
Out of Scope Suggestion

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

๋ถ€๋ถ„ ํด๋ž˜์Šค์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ์ƒ์„ฑ๋œ ํ”„๋ก์‹œ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ์˜ˆ: WebAPI ๋˜๋Š” SignalR ๋ž˜ํผ. ์ƒ์„ฑ๋œ ํ”„๋ก์‹œ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉ์ž ์ •์˜ ๋กœ์ง์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ •๋ง ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ ๋ชจ๋ธ์— ๋Œ€ํ•œ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ API์—์„œ ๋ฐ˜ํ™˜๋œ ๋ชจ๋ธ ํด๋ž˜์Šค์— ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ง์ ‘ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

๋‚˜๋Š” ๋‹น์‹ ์ด ๋ชจ๋“ˆ์— "๋ถ€๋ถ„์ "์„ ์‚ฌ์šฉํ•˜๊ณ  ์—ฌ๊ธฐ์—์„œ ์ œ๊ธฐ๋œ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ค€๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

https://github.com/Microsoft/TypeScript/issues/447

@disshishkov ์•„๋งˆ๋„ ํ™•์žฅ ๋ฐฉ๋ฒ•์œผ๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค : #9

์–ด๋–ค ์ƒํ™ฉ์—์„œ ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๊นŒ? ๊ธฐ์กด ์†”๋ฃจ์…˜์€ ์–ด๋–ป๊ฒŒ ๋ถ€์กฑํ•ฉ๋‹ˆ๊นŒ?

์ด๊ฒƒ์€ ์ž๋™ ์ƒ์„ฑ๋œ ํŒŒ์ผ๊ณผ ๋™์ผํ•œ ์œ ํ˜•์— ๊ธฐ์—ฌํ•˜๋Š” ์‚ฌ์šฉ์ž ํŽธ์ง‘ ํŒŒ์ผ์ด ์žˆ๋Š” WinForms ์œ ํ˜• ํŽธ์ง‘ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด C#์—์„œ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์ด JavaScript/TypeScript์— ์ ์šฉ๋˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ผ๋ถ€ ํด๋ž˜์Šค์—๋Š” ์—ฌ๋Ÿฌ ์ค„ ๋ฒˆํ˜ธ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ๋‚˜์€ ์ฝ๊ธฐ๋ฅผ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐœ๋ณ„ ํด๋ž˜์Šค๋กœ ๋ถ„ํ• ํ•˜๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋…ผ๋ฆฌ(์ด ๋…ผ๋ฆฌ๊ฐ€ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋กœ ์ด๋™ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ), ๊ฐ€์‹œ์„ฑ(๋น„๊ณต๊ฐœ ๋ฐ ๊ณต๊ฐœ) ๋ฐ ๊ธฐํƒ€์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ์œ ํ˜•์œผ๋กœ ๋ถ„ํ• ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถ€๋ถ„ ํด๋ž˜์Šค์˜ ๊ฒฐํ•ฉ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ(์˜ˆ: ๋™์ผํ•œ ๋ฉ”์„œ๋“œ/๋ณ€์ˆ˜ ์„ ์–ธ๊ณผ ๊ฐ™์€ 2๊ฐœ์˜ ๋ถ€๋ถ„ ํด๋ž˜์Šค) ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์˜ค๋ฅ˜๋ฅผ ์•Œ๋ฆฌ๊ณ  throwํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ •๋ง ์„ค๋“๋ ฅ์ด ์—†์Šต๋‹ˆ๋‹ค. ํด๋ž˜์Šค๊ฐ€ ๋„ˆ๋ฌด ์ปค์„œ ๋‹จ์ผ ํŒŒ์ผ์—์„œ ํŽธ์•ˆํ•˜๊ฒŒ ํŽธ์ง‘ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ํฌ๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ์ค‘์š”ํ•œ ๋””์ž์ธ ๋ƒ„์ƒˆ๊ฐ€ ๋‚ฉ๋‹ˆ๋‹ค(์˜ˆ: http://programmers.stackexchange.com/questions/157482์˜ ์ฃผ์„). ๋‹ค๋ฅธ ์œ ํ˜•/๋…ผ๋ฆฌ/๊ฐ€์‹œ์„ฑ/๋“ฑ์œผ๋กœ ๋ถ„ํ• ํ•˜๋Š” ๊ฒƒ์€ ๋‹จ์ผ ํŒŒ์ผ ๋‚ด์—์„œ IDE ๋˜๋Š” ์กฐ์ง์—์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํด๋ž˜์Šค๊ฐ€ ๋„ˆ๋ฌด ์ปค์„œ ํƒ์ƒ‰ํ•  ์ˆ˜ ์—†๋Š” ์ด์œ (ํƒ์ƒ‰ ๋„๊ตฌ๊ฐ€ ๋” ์ข‹์•„์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๊นŒ?)์™€ ์–ธ์–ด๊ฐ€ ํด๋ž˜์Šค๋ฅผ _๋ถ„ํ• _ ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค _๋ถ„ํ•ด_ ์ง€์›ํ•˜๋Š” ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋ฉด ๋…ผ์˜ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ "๋ถ€๋ถ„ ํด๋ž˜์Šค"๊ฐ€ ์กด์žฌํ•ด์•ผ ํ•˜์ง€๋งŒ ํ•จ๊ป˜ ๋ณ‘ํ•ฉ๋˜๋Š” ๋ชจ๋“ˆ์ฒ˜๋Ÿผ ์ž‘๋™ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Intellisense๊ฐ€ ๋ชจ๋“  ๋ชจ๋“ˆ์„ ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ(๋‹น์—ฐํžˆ), ์ด๋ฅผ ํฌํ•จํ•˜๋Š” ์‹ค์ œ JS๋Š” ํ•„์š”ํ•  ๋•Œ๋งŒ ๋กœ๋“œ๋˜๋Š” ๋ชจ๋“ˆ์ด ์žˆ๋Š” ์‹œ์Šคํ…œ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ๋กœ๋“œํ•˜๋Š” ์ˆ˜์—…์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ  ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋” ํ™•์žฅํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ๋Š” ๋ชจ๋“ˆ๋กœ๋งŒ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถ€๋ถ„ ํด๋ž˜์Šค์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ์ƒ์„ฑ๋œ ํ”„๋ก์‹œ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ์˜ˆ: WebAPI ๋˜๋Š” SignalR ๋ž˜ํผ. ์ƒ์„ฑ๋œ ํ”„๋ก์‹œ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉ์ž ์ •์˜ ๋กœ์ง์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ •๋ง ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ ๋ชจ๋ธ์— ๋Œ€ํ•œ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ API์—์„œ ๋ฐ˜ํ™˜๋œ ๋ชจ๋ธ ํด๋ž˜์Šค์— ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ง์ ‘ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

+1 ํฌ๋ฐ˜ํ…Œํ† ๋ ˆ.

์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” .net๊ณผ ์ •ํ™•ํžˆ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ํด๋ž˜์Šค์˜ ์ผ๋ถ€๊ฐ€ ์ƒ์„ฑ๋˜๊ณ (์ด ๊ฒฝ์šฐ Avro ์Šคํ‚ค๋งˆ์—์„œ) ์ƒ์„ฑ๋œ ํด๋ž˜์Šค๋กœ ์ž‘์—…ํ•˜๊ธฐ ์œ„ํ•œ ์ถ”๊ฐ€ ๋„์šฐ๋ฏธ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

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

๋‚ด ๋ฐ์ดํ„ฐ ๊ณ„์ธต ํŒŒ์ผ :

class A {
  x: number;
  y: number;
  z: number;
}

class B extends A {
  value: string;
  flag1: boolean;
  flag2: boolean;
}

ํด๋ž˜์Šค A์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํฌํ•จํ•˜๋Š” ํŒŒ์ผ :

class A {
  constructor(x: number, y: number, z: number) {
    this.x = x;
    this.y = y;
    this.z = z;
  }
  method1(...) { ... }
  ...
  methodN(...) { ... }
}

ํด๋ž˜์Šค B์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํฌํ•จํ•˜๋Š” ํŒŒ์ผ :

class B extends A {
  constructor(x: number, y: number, z: number, value: string) {
    super(x, y, z);
    this.value = value;
    this.flag1 = false;
    this.flag2 = false;
  }
  method1(...) { ... }
  ...
  methodN(...) { ... }
}

๋‚˜์—๊ฒŒ์„œ +1. tt ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜์—ฌ Typescript ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‹ถ์ง€๋งŒ ํ…œํ”Œ๋ฆฟ ์ƒ์„ฑ์œผ๋กœ ๋Œ€์ฒด๋˜์ง€ ์•Š๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

+1 ์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ํ™•์žฅํ•ด์•ผ ํ•˜๋Š” ์ž๋™ ์ƒ์„ฑ ํด๋ž˜์Šค์— ์ •๋ง ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Partial Class๋Š” ์ •๋ง ์ข‹์€๋ฐ ๊ทธ๊ฒƒ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ๋ง์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‹น์‹ ์—๊ฒŒ ๋””์ž์ธ ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ์„ ๋ณด์—ฌ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ฒฝํ—˜์ƒ ๊ทœ์น™์€ ์‚ฌ์šฉํ•˜๋Š” ์–ธ์–ด์— ๊ด€๊ณ„์—†์ด ๋‹จ์ˆœ ๋ฐ”๋ณด(KISS)๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํฐ ํด๋ž˜์Šค๋ฅผ ์ž‘์€ ํด๋ž˜์Šค๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. 1) ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํด๋ž˜์Šค๋กœ ๋ถ„ํ• ํ•˜๊ณ  ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค(๋‹ค๋ฅธ ํด๋ž˜์Šค๋„ ์ด๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Œ). ๋ฐ”ํ€ด๋ฅผ ์žฌ๋ฐœ๋ช…ํ•˜๋Š” ๋Œ€์‹  ๋” ์ž‘์€ ํด๋ž˜์Šค๋„), ๋˜๋Š” 2) ๋ถ„๋ฆฌ ๋ฐ ์ถ”์ƒ/์ธํ„ฐํŽ˜์ด์Šค/์ƒ์†/๊ฐ€์ƒ ๋“ฑ ๋˜๋Š” ๋‹คํ˜•์„ฑ์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ๊ฒƒ์ด ๋“ค์–ด ์žˆ๋Š” ์ฐจ๋Ÿ‰์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ถ€๋ถ„ ํด๋ž˜์Šค๋Š” ์˜๋ฏธ๊ฐ€ ์—†์œผ๋ฉฐ ๋Œ€์‹  ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๋” ํ•ฉ๋ฆฌ์ ์ธ ๊ฒฝ์šฐ ์—ฌ๊ธฐ์— ๋ณต์žก์„ฑ๊ณผ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค. Engine ํด๋ž˜์Šค, Tranny ํด๋ž˜์Šค, Drivetrain ํด๋ž˜์Šค, Door ํด๋ž˜์Šค ๋ฐ Tire ํด๋ž˜์Šค๋ฅผ ๋ณ„๋„์˜ ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค๊ณ  ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ•ด๋‹น ํด๋ž˜์Šค๋กœ ์ด๋™ํ•˜์—ฌ ํ˜ธ์ถœํ•  ๋•Œ ์—ฌ์ „ํžˆ Vehicle ํด๋ž˜์Šค ๋‚ด์—์„œ Vehicle์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธด ์Šคํฌ๋ฆฝํŠธ ๋ฐ ์Šคํฌ๋ฆฝํŠธ ๋ณต์žก์„ฑ์„ ์ค„์ž…๋‹ˆ๋‹ค. Door ํด๋ž˜์Šค๋กœ ๋‹จ์ˆœํ™”ํ•  ์ˆ˜ ์žˆ๋Š” Door ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์—ฌ๊ธฐ ์ €๊ธฐ์— ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. Interface/Abstract/Inheritance/Virtual์€ Vehicle ํด๋ž˜์Šค์˜ ์ผ๋ถ€ ์Šคํฌ๋ฆฝํŠธ์—์„œ Door ํด๋ž˜์Šค ์ •์˜๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๊ทธ๋ƒฅ ๋‚ด ๋งˆ์Œ์—์„œ ๋‚˜์˜จ 1 ์„ผํŠธ ์ƒ๊ฐ์œผ๋กœ ๋งํ•˜์‹ญ์‹œ์˜ค.

@fletchsod-developer: ์ผ๋ถ€ ์ƒํ™ฉ์€ ์ƒ์†์— ์˜ํ•ด ์ ์ ˆํ•˜๊ฒŒ ์ฒ˜๋ฆฌ๋˜์ง€๋งŒ ์ „๋ถ€๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ผ๋ถ€ ๊ฐœ๋ฐœ์ž๋Š” ๋ถ€๋ถ„ ํด๋ž˜์Šค๋ฅผ ์˜ค์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ „๋ถ€๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ๋ถ€๋ถ„ ํด๋ž˜์Šค๊ฐ€ ๋งค์šฐ ์œ ์šฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ์ƒํ™ฉ์ด ์žˆ์ง€๋งŒ ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์œผ๋ฉด ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

@jfrank14 , ์œ„์—์„œ @basarat ์ด ์ œ์•ˆํ•œ ๋Œ€๋กœ #9๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

// File1.ts
class Dog { 
 ...
}

// File2.ts
extends class Dog {
  woof() { /* ... */ }
}

@NoelAbrahams , ํŒŒ์ผ์˜ file1์—์„œ ์ •์˜์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ ๋ฐ˜๋Œ€๋Š” ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๊นŒ? ํฌํ•จ ์ˆœ์„œ์™€ ๋ฌด๊ด€ํ•œ ํ•œ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ๋ถ„์ด TS์šฉ C#์œผ๋กœ ๋ถ€๋ถ„ ํด๋ž˜์Šค๋ฅผ ๊ณ ๋ คํ•˜๊ธฐ๋ฅผ ์ง„์‹ฌ์œผ๋กœ ๋ฐ”๋ž๋‹ˆ๋‹ค... ์ €์—๊ฒŒ ์œ ์ผํ•œ ์ด์œ ๋Š” ์ฝ”๋“œ ์ƒ์„ฑ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด C#์˜ ๋ถ€๋ถ„ ํด๋ž˜์Šค ๋’ค์— ์žˆ๋Š” ์ฃผ๋œ ์ด์œ ์ž…๋‹ˆ๋‹ค... ์šฐ๋ฆฌ๋Š” ํ˜„์žฌ ๋งŽ์€ TS ์ฝ”๋“œ ์ƒ์„ฑ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์ ์  ๋” ๋งŽ์€ ์ผ์„ ํ•  ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค... ํ˜„์žฌ ์šฐ๋ฆฌ๋Š” "// "์— ์˜์กดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

+1 - ์ž๋™ ์ƒ์„ฑ ํด๋ž˜์Šค์— ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๊ฑฐ๋‚˜ ํ˜„์žฌ๊นŒ์ง€ ์ฝ์€ ๋‹ค๋ฅธ ์šฐ์•„ํ•œ ์†”๋ฃจ์…˜์€ ์—†์Šต๋‹ˆ๋‹ค...

+1 - ์ฝ”๋“œ ์ƒ์„ฑ ํด๋ž˜์Šค. ํด๋ผ์ด์–ธํŠธ์— ์ง๋ ฌํ™”๋œ C#/Java ๊ฐ์ฒด

์ƒ์„ฑ๋œ ํด๋ž˜์Šค๋ฅผ ๋ณ‘ํ•ฉํ•  ๋•Œ๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค!

์ด๊ฒƒ์€ ์ƒ์„ฑ๋œ ์ฝ”๋“œ์™€ ์ƒ์„ฑ๋˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ๊ฐ„๋‹จํžˆ ๋ณ‘ํ•ฉํ•  ์ˆ˜ ์žˆ๋Š” ๋งค์šฐ ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

+1

+1 - ๋ถ€๋ถ„์ ์œผ๋กœ ์ƒ์„ฑ๋œ ํด๋ž˜์Šค์—๋„ ํ•„์š”ํ•˜๋ฉฐ ์ด ๋ชฉ์ ์— ํ•„์š”ํ•˜์ง€ ์•Š์€ ์ƒ๋‹นํ•œ ์–‘์˜ ์ฝ”๋“œ๋ฅผ ๋ฐฉ์ถœํ•˜๋Š” ์ƒ์†๋ณด๋‹ค ๋” ์šฐ์•„ํ•ฉ๋‹ˆ๋‹ค.

+1

์ด ์ œํ•œ์— ๋‹ค์‹œ ๋ถ€๋”ช์ณค์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”! :+1:

+1

+1

+1

+1

์‚ฌ๋žŒ๋“ค์ด ๋ฌด์ž‘์œ„๋กœ +1ํ•˜๋ฉด ๊ณ„์† ์ง„ํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ๊นŒ์ง€์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์—ฌ๋Ÿฌ ํŒŒ์ผ์— ๊ฑธ์ณ ์žˆ๋Š” ์ •๋ง ํฐ ํด๋ž˜์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. @RyanCavanaugh ๋Š” ๊ตฌํ˜„์˜ ๋ณต์žก์„ฑ์„ ๋ณด์ฆํ•  ๋งŒํผ ๋ณต์žกํ•˜๊ณ  ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ์˜ ์ฃผ์š” ์„ค๊ณ„ ๋ฌธ์ œ์ผ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค๊ณ  ์ง€์ ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๊ทธ๊ฒƒ์€ ๊ทธ๋“ค์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹ค๋ฅธ ์ฃผ์žฅ์€ C#์— ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  • ๋‹ค๋ฅธ ์ธ์ˆ˜๋Š” ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ ์ƒ์„ฑ๋œ ์ฝ”๋“œ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ์™€ ์„ธ ๋ฒˆ์งธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ์„ค๋“๋ ฅ์ด ์—†๊ณ  ๋„ค ๋ฒˆ์งธ๋Š” #9๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๋งค์šฐ ์œ ์‚ฌํ•œ ์š”๊ตฌ ์‚ฌํ•ญ๊ณผ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ(#2249)๋ฅผ ์ถฉ์กฑํ•˜์ง€ ๋ชปํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์„ค๋ช…์ด ์–ด๋Š ์ •๋„ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

#9๊ฐ€ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ํ›จ์”ฌ ๋” ์ผ๋ฐ˜์ ์ผ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค(์ž์‹ ์˜ ํด๋ž˜์Šค๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—). ๊ทธ๋Ÿฌ๋‚˜ ๋‘ ๊ฐœ์˜ ํŒŒ์ผ์— ํด๋ž˜์Šค ๋‚ด์šฉ์ด ์žˆ๊ณ (ํ•˜๋‚˜๋Š” ์†์œผ๋กœ ์ž‘์„ฑํ•˜๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ํ…œํ”Œ๋ฆฟ์œผ๋กœ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์—) ๋‘ ํŒŒ์ผ ๋ชจ๋‘ ํด๋ž˜์Šค์˜ ํ•„์ˆ˜ ๊ตฌ์„ฑ์›์„ ๋™์ผํ•œ ์ค‘์š”์„ฑ์œผ๋กœ ์ •์˜ํ•˜๊ณ  ๊ทธ ์ค‘ ํ•˜๋‚˜๋ฅผ ์š”๊ตฌํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ "ํ™•์žฅ" ํด๋ž˜์Šค ์ •์˜ ๋‹ค๋ฅธ.

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

๋ช…์‹œ๋œ ์ด์œ ๋กœ ํด๋ž˜์Šค์—์„œ ๋ถ€๋ถ„์ ์ธ ๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š์ง€๋งŒ ๋ชจ๋“ˆ์—์„œ๋Š” IMHO๊ฐ€ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/Microsoft/TypeScript/issues/447

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

  1. ์—ฌ๋Ÿฌ ํŒŒ์ผ์—์„œ ํด๋ž˜์Šค/์œ ํ˜• ์ •์˜๋ฅผ ๋ถ„ํ• ํ•˜๋Š” ๊ธฐ๋Šฅ. ๋Œ€์šฉ๋Ÿ‰ ์ฝ”๋“œ ํŒŒ์ผ์˜ ๊ฒฝ์šฐ ์œ ์ง€๋ณด์ˆ˜์„ฑ++ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.
  2. ์ปดํŒŒ์ผ๋Ÿฌ/๋นŒ๋“œ ์‹œ์Šคํ…œ์ด ์ปดํŒŒ์ผ ํƒ€์ž„์— ์กฐ๊ฑด๋ถ€ ์—ฐ๊ฒฐ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ. ์œ ์ถ” MSBuild, C#์˜ ๊ตฌ์ฒด์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€: DBML, ๋””์ž์ด๋„ˆ ํด๋ž˜์Šค ๋ฐ https://github.com/dotnet/corefx/pull/2045/files ์™€ ๊ฐ™์€ ๋” ๋ฉ‹์ง„ ๊ฒƒ๋“ค
  3. ๊ณ ์œ ํ•œ ๋ณดํ˜ธ ๊ธฐ๋Šฅ์œผ๋กœ ๋‘ ๊ฐœ(๋˜๋Š” ๊ทธ ์ด์ƒ)์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฝ”๋“œ ์ฒดํฌ์ธ ์ค‘์— ์„œ๋กœ ์ถฉ๋Œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐˆ๋“ฑ ํ•ด๊ฒฐ์ด ํ„ฐ์ง„๋‹ค! :)
  4. ๊ธฐ๋ณธ partial ํด๋ž˜์Šค์— ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•œ ๋‹ค์Œ ์‚ฌ์šฉ์ž ์ง€์ • ์˜ค๋ฒ„๋กœ๋“œ์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ๋ถ€๋ถ„์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค!

์ €๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๋ฐ์ดํ„ฐ ๋ ˆ์ด์–ด๋ฅผ ๋ณ„๋„์˜ ํด๋ž˜์Šค๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ๋ฏฟ์œผ๋ฉฐ ์ฃผ๋กœ ์ด๋Ÿฌํ•œ ๋ ˆ์ด์–ด์—์„œ ์ •์  ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋” ๋งŽ์€ ์ฝ”๋“œ์™€ ๋œ ์œ ์ง€ ๋ณด์ˆ˜๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ •๋ง๋กœ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

ํ™•์žฅ ๋ฉ”์„œ๋“œ๋Š” ๊ฐ์ฒด์ง€ํ–ฅ ํŒจํ„ด์˜ ์˜ํ–ฅ์„ ๋ฐ›๋Š” ํ•ต์‹ฌ ์–ธ์–ด ๊ธฐ๋Šฅ์œผ๋กœ ์ปดํŒŒ์ผ ์‹œ ์ฒ˜๋ฆฌ๋˜์ง€๋งŒ ๋ถ€๋ถ„ ํด๋ž˜์Šค๋Š” ์ปดํŒŒ์ผ ์ „ ๋‹จ๊ณ„์—์„œ ์Šคํ‹ฐ์นญ๋˜๋Š” ๋ฌธ์„œ/์ฝ”๋“œ ๋ ˆ์ด์•„์›ƒ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋ถ€๋ถ„ ํด๋ž˜์Šค, ์ถ”์ƒ ํด๋ž˜์Šค ๋ฐ ํ™•์žฅ ๋ฉ”์„œ๋“œ์˜ ์œ ์‚ฌ์„ฑ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋ถ„๋ช…ํ•œ ์ฐจ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

:+1: ๋ฌดํ•ดํ•œ "๋ถ€๋ถ„ ํด๋ž˜์Šค"๋ฅผ TypeScript๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ถ€๋ถ„ ํด๋ž˜์Šค์— ๋Œ€ํ•œ ๋‚˜์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ์ฝ”๋“œ ์ƒ์„ฑ์„ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ํŒ€์€ ํ•œ ํŒŒ์ผ์—์„œ ํด๋ž˜์Šค์˜ ์ผ๋ถ€๋ฅผ ์ž๋™ ์ƒ์„ฑํ•˜๊ณ  ๋‹ค๋ฅธ ํŒŒ์ผ์—์„œ ์ง์ ‘ ์‚ฌ์šฉ์ž ์ง€์ • ๋ฉ”์„œ๋“œ์™€ ์†์„ฑ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์„ ํƒํ•œ ์–ธ์–ด์™€ ๊ด€๋ จ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— @RyanCavanaugh ๊ฐ€ "๊ทธ๋Ÿฐ ์ข…๋ฅ˜์˜ ์ƒํ™ฉ์ด JavaScript/TypeScript์— ์ ์šฉ๋˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์€" ์ด์œ ๊ฐ€ ์•ฝ๊ฐ„ ํ˜ผ๋ž€์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

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

+1

+1

์ฝ”๋“œ ์ƒ์„ฑ ๋ชฉ์ ์œผ๋กœ +1.

C# ํ™˜๊ฒฝ์—์„œ C# ํด๋ž˜์Šค์˜ ๋ณ€ํ™˜๊ธฐ๋ฅผ TypeScript ํด๋ž˜์Šค์— ํ†ตํ•ฉํ•˜๋ฉด TypeScript ํด๋ž˜์Šค๋ผ๊ณ ๋„ ํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ ์ธก์ด ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๊ณ  partial ํด๋ž˜์Šค๊ฐ€ ์ƒ์„ฑ๋˜๋ฏ€๋กœ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ์ธก ๊ฐ„์— ํด๋ž˜์Šค์— ๋Œ€ํ•œ ๋‘ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์ •์˜๋ฅผ ์œ ์ง€ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๊ฐ€ ์š”์ฒญํ•˜๋Š” ๊ฒƒ์€ ๊ธฐ๋ณธ TypeScript์—์„œ ๊ณ„์† ๊ฐœ๋ฐœํ•˜๋ฉด์„œ ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉ์ž ์ •์˜๋ฅผ ํ—ˆ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฝ”๋“œ ์ƒ์„ฑ ์‹œ๋‚˜๋ฆฌ์˜ค์˜ ๊ฒฝ์šฐ +1

+1 ์ฝ”๋“œ ์ƒ์„ฑ์— ๋งค์šฐ ์œ ์šฉ

์ฝ”๋“œ ์ƒ์„ฑ์— ์ƒ์†์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ƒ์†์€ ๋” ๋ณต์žกํ•˜๊ณ  ๋” ๋งŽ์€ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

2015๋…„ 8์›” 10์ผ ์›”์š”์ผ ์˜ค์ „ 10์‹œ 9๋ถ„ Gorgi Kosev [email protected]์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ ์ƒ์„ฑ์— ์ƒ์†์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/Microsoft/TypeScript/issues/563#issuecomment -129468291
.

์ƒ์†์€ ์“ธ๋ชจ์—†๋Š” ์ด๋ฆ„ ์ปคํ”Œ๋ง์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์ƒ์†์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ ๋œ ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค.

  1. ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์„ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์‹ฌํ™”์‹œํ‚ค๊ณ  ์ธ์Šคํ„ด์Šคํ™” ์†๋„๋ฅผ ๋Šฆ์ถฅ๋‹ˆ๋‹ค.
    ๋Œ€๋ถ€๋ถ„์˜ ์•ฑ์—์„œ ํฐ ๋ฌธ์ œ๋Š” ์•„๋‹ˆ์ง€๋งŒ ๊ฒŒ์ž„์„ ์ œ์™ธํ•œ ๋ชจ๋“  ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  2. ์ถ”์ƒ ๋ฐ ์žฌ์ •์˜๊ฐ€ ์—†์œผ๋ฉด ์ผ๋ถ€ ์œ ํ˜• ์•ˆ์ „์„ฑ์„ ์žƒ๊ฑฐ๋‚˜
    ๋‘˜ ์‚ฌ์ด์˜ ์บ์ŠคํŒ…๊ณผ ๊ฐ™์€ ์ผ๋ถ€ ์ˆ˜์ƒํ•œ ํŒจํ„ด์˜ ํ•„์š”์„ฑ์„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.
    ์œ ํ˜•;
  3. ๊ธฐ๋ณธ ํด๋ž˜์Šค๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์•„์ด๋””์–ด๋ฅผ ์ „๋‹ฌํ•˜๋ฏ€๋กœ ์ „๋ฐ˜์ ์œผ๋กœ ํ˜ผ๋ž€์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.
    codegen์˜ ๊ฒฝ์šฐ๋Š” ๋“œ๋ฌผ๊ฒŒ ๋‹ค๋ฅธ ํด๋ž˜์Šค์— ์˜ํ•ด ํ™•์žฅ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

typescript์— codegen์„ ์ง€์›ํ•˜๋Š” ๋ถ€๋ถ„ ํด๋ž˜์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ๋งํ•˜์ง€ ์•Š๊ณ 
๋ถ€๋ถ„ ํด๋ž˜์Šค๊ฐ€ ์ƒ์†์ด๋‚˜
๊ตฌ์„ฑ.

@JoshMcCullough JS์˜ ์ƒ์† ์˜ค๋ฒ„ํ—ค๋“œ๋Š” ์ตœ์†Œํ™”๋˜๋ฉฐ ๋ถ€๋ถ„ ํด๋ž˜์Šค๋ณด๋‹ค ์–ผ๋งˆ๋‚˜ ์ง€์ €๋ถ„ํ•œ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ž ์žฌ์ ์œผ๋กœ ํด๋ž˜์Šค๋ฅผ 10๊ฐœ์˜ ํŒŒ์ผ๋กœ ๋ถ„ํ• ํ•˜๊ณ  ๋ชจ๋“  ๊ณณ์—์„œ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@yahiko00 ์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” "์“ธ๋ชจ์—†๋Š” ์ด๋ฆ„ ์ปคํ”Œ๋ง"์ด๋ž€? ์•„๋ž˜ 2๋ฒˆ(ํ™•์žฅ ํด๋ž˜์Šค์˜ ์ด๋ฆ„์„ ํ•˜๋“œ์ฝ”๋”ฉ)์„ ์–ป๊ธฐ ์œ„ํ•ด ํ•ด์•ผ ํ•  ์ผ์„ ์–ธ๊ธ‰ํ•ฉ๋‹ˆ๊นŒ?

@hdachev

  1. ์•ฝ๊ฐ„์˜ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์žˆ์ง€๋งŒ ์•„์ฃผ ๋ฏธ๋ฏธ ํ•ฉ๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ๊ธฐ๊ณ„ ๋ช…๋ น์œผ๋กœ ์ง์ ‘ ๋ณ€ํ™˜๋˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ๋ˆˆ์— ๋•๋‹ˆ๋‹ค.
  2. ์ข‹์€ ์  - ์ƒ์„ฑ๋œ ๋‹ค๋ฅธ ํด๋ž˜์Šค์—์„œ ์ƒ์„ฑ๋œ ํด๋ž˜์Šค๋ฅผ ์ฐธ์กฐํ•ด์•ผ ํ•  ๋•Œ ํ™•์žฅ๋œ ํด๋ž˜์Šค๋ฅผ ์–ป์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.
  3. ์ด๋Ÿฌํ•œ ํด๋ž˜์Šค๋Š” ์‹ค์ œ๋กœ ํ™•์žฅ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ฃ ?

AFAIK ์ด๊ฒƒ์€ ES7+ ๋ ˆ์ด๋”์— ์žˆ์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ๊ทธ๊ฒŒ ๋ฌธ์ œ์ผ์ˆ˜๋„...

์–ด์จŒ๋“  ๊ธฐ์กด ํด๋ž˜์Šค์˜ ํ”„๋กœํ† ํƒ€์ž…์— ์ถ”๊ฐ€ ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ JavaScript์—์„œ ๋งค์šฐ ๊ฐ„๋‹จํ•˜๊ณ  ์ „ํ˜€ ๋“œ๋ฌธ ์ผ์ด ์•„๋‹ˆ๋ฏ€๋กœ ์ด์— ๋Œ€ํ•œ ๊ตฌ๋ฌธ์„ ๊ฐ–๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค...

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

2015๋…„ 8์›” 10์ผ ์›”์š”์ผ ์˜ค์ „ 11:03 Gorgi Kosev [email protected]
์ผ๋‹ค:

@JoshMcCullough https://github.com/JoshMcCullough ์ƒ์† ์˜ค๋ฒ„ํ—ค๋“œ
JS์—์„œ๋Š” ์ตœ์†Œํ•œ์ด๋ฉฐ ๋ถ€๋ถ„ ํด๋ž˜์Šค๋ณด๋‹ค ์–ผ๋งˆ๋‚˜ ์ง€์ €๋ถ„ํ•œ์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
๊ทธ๊ฒƒ๋“ค์„ ์‚ฌ์šฉํ•˜๋ฉด ์ž ์žฌ์ ์œผ๋กœ ํด๋ž˜์Šค๋ฅผ 10๊ฐœ์˜ ํŒŒ์ผ๋กœ ๋ถ„ํ• ํ•˜๊ณ 
๊ณณ๊ณณ์— ์žˆ๋Š” ๋ฐฉ๋ฒ•๋“ค.

@yahiko00 https://github.com/yahiko00 ๋ฌด์Šจ "์“ธ๋ชจ์—†๋Š” ์ด๋ฆ„
์ปคํ”Œ๋ง"์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ํ•„์š”ํ•œ ํ•ญ๋ชฉ์„ ์ฐธ์กฐํ•ฉ๋‹ˆ๊นŒ?
์•„๋ž˜ 2๋ฒˆ(ํ™•์žฅ ํด๋ž˜์Šค์˜ ์ด๋ฆ„์„ ํ•˜๋“œ์ฝ”๋”ฉ)์„ ์–ป์œผ๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•˜๋‚˜์š”?

ํด๋ž˜์Šค MyClass๋Š” GeneratedMyClass { ... }๋ฅผ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค.

@hdachev https://github.com/hdachev

1.

์•ฝ๊ฐ„์˜ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์žˆ์ง€๋งŒ ์ตœ์†Œํ•œ์˜
https://jsperf.com/prototype-chain-vs-direct-calls - ๋ˆˆ์— ๋„๋Š” ๊ฒƒ๋งŒ
๋ช‡ ๋Œ€์˜ ๊ธฐ๊ณ„๋กœ ์ง์ ‘ ๋ณ€ํ™˜ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ
์ง€์นจ
2.

์ข‹์€ ์  - ํ•ด์•ผ ํ•  ๋•Œ ํ™•์žฅ๋œ ํด๋ž˜์Šค๋ฅผ ์–ป์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.
์ƒ์„ฑ๋œ ๋‹ค๋ฅธ ํด๋ž˜์Šค์—์„œ ์ƒ์„ฑ๋œ ํด๋ž˜์Šค๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.
์‚ผ.

์ด๋Ÿฌํ•œ ํด๋ž˜์Šค๋Š” ์‹ค์ œ๋กœ ํ™•์žฅ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด
๊ทธ๊ฒƒ๋“ค์„ ์ƒ์„ฑํ•˜๊ณ  ๊ทธ๊ฒƒ์„ ๋๋‚ด์‹ญ์‹œ์˜ค. ๋งž์Šต๋‹ˆ๊นŒ?

AFAIK ์ด๊ฒƒ์€ ES7+ ๋ ˆ์ด๋”์— ์žˆ์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

์–ด์จŒ๋“  ๊ธฐ์กด ํด๋ž˜์Šค์˜ ํ”„๋กœํ† ํƒ€์ž…์— ์ถ”๊ฐ€ ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€
JavaScript์—์„œ๋Š” ๋งค์šฐ ์‚ฌ์†Œํ•˜๊ณ  ์ „ํ˜€ ๋“œ๋ฌธ ์ผ์ด ์•„๋‹ˆ๋ฏ€๋กœ
๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ๊ตฌ๋ฌธ์„ ๊ฐ–๋Š” ์ข‹์€ ์ƒ๊ฐ ...

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/Microsoft/TypeScript/issues/563#issuecomment -129483174
.

@Davidhanson90 ๊ทธ ํŒŒ์ผ์—๋Š” ํด๋ž˜์Šค๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์— ์ด๊ฒƒ์„ ๊ฒŒ์‹œํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๊นŒ?

์˜ฌ๋ฐ”๋ฅธ ์Šค๋ ˆ๋“œ์— ๊ฒŒ์‹œํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. https://github.com/Microsoft/TypeScript/issues/447

+1

+1

+100

+1

+1

์ฝ”๋“œ ์ƒ์„ฑ์„ ์œ„ํ•ด +1.
์ €๋Š” angularjs์™€ webapi์— ๋น ์ ธ ๋“ค์—ˆ๊ณ  ๋ณธ์งˆ์ ์œผ๋กœ C# ๊ฐœ์ฒด ๋ฐ ์„œ๋น„์Šค์—์„œ ์ž๋™ JS ์ •์˜๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋„๊ตฌ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ "์Šค์บํด๋”ฉ๋œ" JS ์ •์˜๋ฅผ ํŽธ์ง‘ํ•˜์ง€ ์•Š๊ณ ๋„ ์ด๋Ÿฌํ•œ ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ๋ช‡๋ช‡ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์ด๊ฒƒ์„ ์š”์ฒญํ•˜๋Š” ๊ฒƒ์„ ๋ณด์•˜๊ณ  ์šฐ๋ฆฌ๋„ ๋น„์Šทํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

+1 ์ฝ”๋“œ ์ƒ์„ฑ

+1 ์ฝ”๋“œ ์ƒ์„ฑ, angular์—๋Š” ๋งŽ์€ ์ƒ์šฉ๊ตฌ ์ฝ”๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ๋งŽ์€ ์ƒ์„ฑ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์ง€๋งŒ ๋ถ€๋ถ„ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ›จ์”ฌ ๋” ๋งŽ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ ์ƒ์„ฑ์„ ์œ„ํ•ด ๋‹ค์‹œ +1. ๋‹ค๋ฅธ ํŒŒ์ผ์˜ ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์€ ๊ธฐ๊ปํ•ด์•ผ ์ง€์ €๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

@RyanCavanaugh , ์ด๊ฒƒ์„ "+1" ๋ชจ๋“œ์—์„œ ๋ฒ—์–ด๋‚˜ ์ƒ์‚ฐ์ ์ธ ๋ฐฉํ–ฅ์œผ๋กœ

-1 ๋‹ค์Œ ๊ตฌ๋ฌธ์ด ๋ฏน์Šค์ธ์— ๋” ์ข‹์Šต๋‹ˆ๋‹ค. #2919

์™œ ๋ถ€๋ถ„ ํด๋ž˜์Šค์™€ ๋ฏน์Šค์ธ์„ ๋‘˜ ๋‹ค ๊ฐ€์งˆ ์ˆ˜ ์—†๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ „ํ˜€ ๊ด€๋ จ์ด ์—†๋Š” ๋‘ ๊ฐ€์ง€ ๊ธฐ๋Šฅ.

+1

์ด๊ฒƒ์€ ์ฝ”๋“œ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ์œ ์šฉํ•˜์ง€๋งŒ ์ƒ์„ฑ๋œ ์ฝ”๋“œ์— ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ์‹ถ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

+1

๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋ชจ๋‘ ์ถฉ์กฑํ•ด์•ผ ํ•˜๋Š” ์ œ์•ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๋‹น์‹ ์€ ๋‹ค๋ฅธ ์žฅ์†Œ์—์„œ ๋‹น์‹  ์ž์‹ ์˜ ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํด๋ž˜์Šค์— ์ƒˆ ๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: ๋‚ด์žฅ).

(2)์˜ ๊ฒฝ์šฐ ์ผ๋ฐ˜์ ์œผ๋กœ :: ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ค‘์œ„ ๊ตฌ๋ฌธ์„ ์–ป์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด์ „ ํด๋ž˜์Šค๋ฅผ ์ƒˆ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ผ๋ถ€๋กœ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋™์ ์œผ๋กœ ์ „๋‹ฌํ•˜๋ ค๋ฉด ํ”„๋กœํ† ํƒ€์ž…์„ ์‹ค์ œ๋กœ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

interface ITimes {
    times(n: number): number
}

Array implements ITimes {
    times(n: number): number {
        return this.length * n
    }
}

// The compiler should check that all methods of ITimes and IOther are implemented.
Number implements ITimes, IOther {
    times(n: number): number {
        return this * n
    }

    other(): void {}
}

// The old types should typecheck with the new interface.
const x: ITimes = true ? [] : 0
x.times(3)

// The interface list can be empty. This essentially gives you partial classes.
MyClass implements {
    anotherMethod(): void {}
}

(์˜ˆ์ œ์—์„œ๋Š” ๋ฌธ์ž์—ด ๋ฉ”์„œ๋“œ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์ด๊ฒƒ๋“ค์€ ๊ธฐ๋ณธ ์ œ๊ณต ์œ ํ˜•์ด๋ฏ€๋กœ ์œ ํ˜• ๊ฒ€์‚ฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฉด ๊ธฐํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์Šต๋‹ˆ๋‹ค.)

์ด๊ฒƒ์ด ์ง„์ •ํ•œ ๋ถ€๋ถ„ ํด๋ž˜์Šค์— ๋น„ํ•ด ๊ฐœ์„ ๋œ ์ ์€ ํด๋ž˜์Šค์— ๋‹จ์ผ ์ •์˜๊ฐ€ ์žˆ๊ณ  ๋‹ค๋ฅธ ๊ณณ์—์„œ๋Š” ์ด๋ฅผ ํ™•์žฅํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํด๋ž˜์Šค๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋ช…ํ™•ํ•œ ์žฅ์†Œ๊ฐ€ ์žˆ๊ณ  JS๋กœ์˜ ๋ฒˆ์—ญ์„ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“ ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

:+1: ๋ถ€๋ถ„ ์ˆ˜์—…๋„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์˜ ์ƒํƒœ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ด ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Set#add , 'Set#remove' ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Set ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๋Š” Math ํŒจํ‚ค์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

// math.ts
export partial class Set {
  add(){}
  remove(){}
}

Relation ๋ฐ Tuple ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๋Š” ์„ ํƒ์  , heavy , Relational ํŒจํ‚ค์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด Relational ํŒจํ‚ค์ง€๋Š” Set#product ๋ฉ”์„œ๋“œ๋„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

// relational.ts
///<reference path="./../math/tsd.d.ts"/>
partial class Set {
  product(){}
}

export class Relation(){}
export class Tuple(){}

๋ถ€๋ถ„ ์ˆ˜์—…์„ ํ†ตํ•ด ๋ณด๋‹ค ์œ ์—ฐํ•œ ๋ฐฉ์‹์œผ๋กœ ์ˆ˜์—…์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌด๊ฑฐ์šด relational ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด ๊ธฐ๋ณธ ์„ค์ • ๊ธฐ๋Šฅ์„ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ partial ํด๋ž˜์Šค๋Š” ํด๋ž˜์Šค์— ์ถ”๊ฐ€ ๊ธฐ๋Šฅ๋งŒ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด ๊ฒฝ์šฐ์— ๋ถ€๋ถ„์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ฉ‹์ง„ API๋ฅผ ๊ฐ€์งˆ ๋ฌด์–ธ๊ฐ€๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด ๋จธ๋ฆฌ๋ฅผ ๊ธ์ ์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์ €์žฅ์†Œ ํŒจํ„ด๋ฟ์ž…๋‹ˆ๋‹ค.

// Without partials

// base

export class Base {
    static registerOperation(opName, method){
        this.prototype[opName] = method;
    }
    operation(name, ...args){
        return this[name].apply(this, args);
    }
}

// math.ts
import {Base} from './base';
class Set extends Base{
    // Define the methods here
    add(){}
    remove(){}
}

// Or here
Set.registerOperation("add", function(...){});
Set.registerOperation("remove", function(...){});

// relational.ts
import {Set} from './../math/math';

Set.registerOperation("product", function(...){});

// app.ts

import {Set} from 'math';

var set = new Set();
set.add // compiler error
set.remove // compiler error
set.product // compiler error

// have to use something like
set.operation("add", args);
// or
(<any>set).add(arg);

+1 WebApi๋ฅผ ํ†ตํ•ด ํด๋ž˜์Šค์™€ ํ”„๋ก์‹œ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด t4๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ž๋™ ์ƒ์„ฑ์€ ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ์—์„œ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ ๊ฐ™์€๋ฐ ์ž๋™ ์ƒ์„ฑ์— ๊ด€ํ•ด์„œ๋Š” ๋ถ€๋ถ„ ํด๋ž˜์Šค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค!

ํŠนํžˆ React์—์„œ ๋™์ผํ•œ ํด๋ž˜์Šค์˜ ์ธก๋ฉด์„ ๋ถ„ํ• ํ•˜๋Š” ๋ฐ ์ข‹์Šต๋‹ˆ๋‹ค.
+1

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

๋ถ€๋ถ„ ํด๋ž˜์Šค์˜ ์ฝ”๋“œ ์ƒ์„ฑ ๋ฐ ์ด๋Ÿฌํ•œ ํด๋ž˜์Šค์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ๋ฉค๋ฒ„๋ฅผ ๋ณ„๋„์˜ ํŒŒ์ผ๋กœ ํ•ธ๋“œ์ฝ”๋”ฉํ•˜๋ ค๋ฉด +1์ž…๋‹ˆ๋‹ค.

+1

+1 js api ์„œ๋น„์Šค์— ๋ฉ”์†Œ๋“œ ๊ธฐ๋ฐ˜์ด ๋„“์Šต๋‹ˆ๋‹ค. ๊ฐ ๋ฉ”์†Œ๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ํŒŒ์ผ๋กœ ๋ถ„ํ• ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค.

fb (facebook) ๋˜๋Š” gq (google analytics) ์™€ ๊ฐ™์€ api ์„œ๋น„์Šค๋Š” ๊ฐœ๋ฐœ ๋‚ด๋‚ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ•˜๋‚˜์˜ ์ „์—ญ ํด๋ž˜์Šค ๋˜๋Š” ๊ฐœ์ฒด๊ฐ€ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

+1

์ด ๊ธฐ๋Šฅ์€ ์šฐ๋ฆฌ์—๊ฒŒ๋„ ํฐ ์žฅ์ ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๋ชจ๋“  ์œ ํ˜•์˜ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ด๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•˜๊ณ  ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฏธ๋“ค์›จ์–ด๋ฅผ ๊ฐœ๋ฐœํ–ˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์„œ๋ฒ„์— ์˜ํ•ด ๋…ธ์ถœ๋œ ๊ฒƒ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ์˜ ์ผ๋ถ€๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

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

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

๋‚ด๊ฐ€ ์ดํ•ดํ•˜๋Š” ํ•œ(์ €๋Š” C# ๊ฐœ๋ฐœ์ž์ž…๋‹ˆ๋‹ค) ์—ฌ๊ธฐ์— ์ œ์•ˆ๋œ ์†”๋ฃจ์…˜(https://github.com/Microsoft/TypeScript/issues/9)์œผ๋กœ๋Š” ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

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

+1

+1 ์ฝ”๋“œ ์ƒ์„ฑ์— ๋งค์šฐ ์œ ์šฉ

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

์ƒ์„ฑ๋œ ํด๋ž˜์Šค๊ฐ€ ์žˆ์œผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

import {MyClass} from "./MyClass.generated"

MyClass.prototype.partialMethod1 = function() {
  return true;
}
MyClass.prototype.partialMethod2 = function(abc: string) {
  this.doSomething(abc);
}

declare module './MyClass.generated' {
  interface MyClass {
    partialMethod1(): boolean;
    partialMethod2(abc: string): void;
  }
}

@disshishkov ์ปค๋ฒ„ ์•„๋ž˜์—์„œ ๊ตฌํ˜„ํ•˜๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์ˆ˜๋™์œผ๋กœ ํ”„๋กœํ† ํƒ€์ž…์„ ์ˆ˜์ •ํ•˜๊ณ  ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์œ ์ง€ ๊ด€๋ฆฌํ•  ํ•„์š” ์—†์ด ์–ธ์–ด์—์„œ ์ ์ ˆํ•œ ์ผ๊ธ‰ ์ง€์›์„ ์›ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” Elephant-Vssel์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋ถ€๋ถ„ ํด๋ž˜์Šค์˜ ์ˆ˜๋™์œผ๋กœ ์ œ์ž‘๋œ ๋ถ€๋ถ„์€ ์ƒ์„ฑ๋œ ๋ถ€๋ถ„์—์„œ ๊ฐ€๋Šฅํ•œ ํ•œ ๋Š์Šจํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(TS์˜ ๋””์ž์ธ ํƒ€์ž„์—).

@david-driscoll์˜ ์ œ์•ˆ์€ ๋งŽ์€ ๊ฒฝ์šฐ์— ํšจ๊ณผ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚ด๊ฐ€ ๋งํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ ํ”„๋กœํ† ํƒ€์ž…์€ ๋‚ด๋ถ€ ๋ณ€์ˆ˜์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํด๋ž˜์Šค์˜ ํ•ต์‹ฌ ๋ถ€๋ถ„์„ ์ƒ์„ฑํ•œ ๋‹ค์Œ ์‚ฌ์šฉ์ž ์ง€์ • ์ฝ”๋“œ๋กœ ๋ณด๊ฐ•ํ•˜๋ ค๋Š” ์ฝ”๋“œ ์ƒ์„ฑ ์ปจํ…์ŠคํŠธ์—์„œ ์ด ์ ‘๊ทผ ๋ฐฉ์‹์˜ ์œ ์šฉ์„ฑ์„ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.

+1

@david-driscoll์€ ์ด ๊ธฐ๋Šฅ์„ ์ œ๊ฑฐํ•˜๋Š” ํ›Œ๋ฅญํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. (๊ฐœ์ธ/๋ณดํ˜ธ๋œ ์†์„ฑ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•จ). ๋‹ค์ค‘ ๋ถ€๋ถ„ ํด๋ž˜์Šค ์„ ์–ธ์€ ์–ด๋–ป๊ฒŒ ๋˜๋Š”์ง€ ๊ถ๊ธˆํ•˜์‹ญ๋‹ˆ๊นŒ? ์ด๋“ค์˜ ์ƒํ˜ธ ๊ฐ€์‹œ์„ฑ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

++ 1 ์ž๋™ ์ƒ์„ฑ ๋ชจ๋ธ์„ ํ™•์žฅํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๋ถ€๋ถ„์  ๋ถ€์กฑ์€ ์ •๋ง ๋‚˜๋ฅผ ์•„ํ”„๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค..

์—ฌ๊ธฐ ๋ฒ”์œ„์˜ ์œ ์ผํ•œ ๊ฒƒ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ @david-driscoll์ด ์ œ์•ˆํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ƒˆ ๋ฉ”์„œ๋“œ(ํ”„๋กœํ† ํƒ€์ž…์— ๋„ฃ์„ ๊ฒƒ)์™€ ์ƒˆ _non-initialized_ ์†์„ฑ(codegen์ด ์—†์Œ)์„ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ƒˆ ์ดˆ๊ธฐํ™” ์†์„ฑ์€ ์„ ์–ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. (์ด๊ฒƒ์€ ์ƒ์„ฑ์ž codegen์— ๋ถ€์ž‘์šฉ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค).

downvoted, ๋‚ด ํ”„๋ž‘์Šค์–ด๋ฅผ ์šฉ์„œํ•˜์‹ญ์‹œ์˜ค. ๋ถ€๋ถ„ ํด๋ž˜์Šค๋Š” OOP์—์„œ ๋ถˆ๊ฐ€ํ”ผํ•œ God ํด๋ž˜์Šค๋ฅผ ์—ฌ๋Ÿฌ ํŒŒ์ผ๋กœ ์ฒญํฌํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฝ๋„๋ก (์—ฌ์ „ํžˆ God ํด๋ž˜์Šค์ด์ง€๋งŒ) ์–ด๋ฆฌ์„์€ ์‹œ๋„์ž…๋‹ˆ๋‹ค.

OOP์—๋Š” ๋ฏธ๋ž˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

FP๋กœ ์˜ค์„ธ์š”, ์šฐ๋ฆฌ๋Š” ์ฟ ํ‚ค์™€ ๋‹จ์ผ ํด๋ž˜์Šค ์—†์ด ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ๊ธฐ๋ณธ์ ์œผ๋กœ interface A { method(): void } A.prototype.method = function() { }; ํ†ตํ•ด ์ด๊ฒƒ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ์ •ํ™•ํžˆ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ์„คํƒ•์œผ๋กœ ์ฝ”๋“œํ™”ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ž์ „๊ฑฐ ๋ณด๊ด€์†Œ์—์„œ ํ•œ ๊ฐ€์ง€ ํ‚ค์›Œ๋“œ๋Š” partial ์ž…๋‹ˆ๋‹ค. ๊ฐ„๋žตํ•œ ์—ญ์‚ฌ์  ๋น„๋„คํŠธ: C#์—์„œ partial class ๋Š” ์›๋ž˜ extension class (ํ•˜๋‚˜์˜ ์„ ์–ธ์„ ์ œ์™ธํ•œ ๋ชจ๋“  ์„ ์–ธ์— ์ ์šฉ)๊ฐ€ ๋  ์˜ˆ์ •์ด์—ˆ์ง€๋งŒ ์–ด๋–ค ์„ ์–ธ์ด ์–ด๋–ค ์„ ์–ธ์ด ๋ ์ง€์— ๋Œ€ํ•œ ๋ช…ํ™•ํ•œ ๊ตฌ๋ถ„์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค. extension ๋ฐ ๋น„ํ™•์žฅ ์„ ์–ธ์ด ๋  ์„ ์–ธ. ๋Œ€์‹  _all_ ํด๋ž˜์Šค์— ๋ฐฐ์น˜ํ•ด์•ผ ํ•˜๋Š” ์ˆ˜์ •์ž partial ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ TypeScript์˜ ๊ฒฝ์šฐ๊ฐ€ _์•„๋‹™๋‹ˆ๋‹ค_. ์˜คํžˆ๋ ค ๊ทธ ๋ฐ˜๋Œ€. ์—ฌ๊ธฐ์„œ ํ•˜๋‚˜์˜ ํด๋ž˜์Šค("_primary_ ์„ ์–ธ"์ด๋ผ๊ณ  ํ•จ)๋งŒ ์ƒ์„ฑ์ž/์ดˆ๊ธฐํ™”๋œ ๋ฉค๋ฒ„ ํ•„๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์„ ์–ธ์—๋Š” ์ƒˆ๋กœ์šด ์ˆ˜์ •์ž๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋“  ์„ ์–ธ("_extension_ ์„ ์–ธ"์ด๋ผ๊ณ  ํ•จ)์—๋Š” ์ •์ , ๋ฉ”์„œ๋“œ ๋ฐ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ํ•„๋“œ๋งŒ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ธฐ๋ณธ์ด ์•„๋‹˜์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ์ผ๋ถ€ ์ˆ˜์ •์ž๊ฐ€ _ํ•„์š”_ํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ๊ฐ€์žฅ ์ข‹์€ ์ถ”์ธก์€

class Foo {
  x = 6; // only legal to initialize here
  constructor() { } // only legal to have constructor here
  someMethod() { }
}

// vvvvvvvvv thoughts?
   extension class Foo {
     someOtherMethod() {
     }
   }

:sparkles: :bike: :์ง‘: :sparkles:

Bikeshedding์ด๋“  ์•„๋‹ˆ๋“  ์ด๊ฒƒ์€ ๋ฏธ๋ž˜์˜ ECMAScript ํ‘œ์ค€์„ ๋ฐฉํ•ดํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‚ญ์ œ๋œ #311 ์ฒ˜๋Ÿผ ๋”์ฐํ•˜๊ฒŒ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. ์™œ ์ด๊ฒƒ์ด ๊ณ ๋ คํ• ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ์ง€๋งŒ ์ ์ ˆํ•œ mixin ์ง€์›์€ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

extension ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ™•์žฅ ๋ฐฉ๋ฒ• ๊ณผ ์ถฉ๋Œํ•ฉ๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ํ™•์žฅ ๋ฐฉ๋ฒ•์„ ์™„์ „ํžˆ ๋ฌดํšจํ™”ํ•ฉ๋‹ˆ๊นŒ?

@kitsonk ๋ฏน์Šค์ธ ์ œ์•ˆ์—๋Š” ๋” ๋งŽ์€ ์—ด๋ฆฐ ์งˆ๋ฌธ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ถ€๋ถ„ ํด๋ž˜์Šค ์ œ์•ˆ์€ TypeScript์—์„œ ์ด๋ฏธ ํ—ˆ์šฉ๋˜๋Š” ์ผ๋ถ€ ๊ตฌ๋ฌธ ์„คํƒ•๊ณผ ํ•จ๊ป˜ ์ฝ”๋“œํ™”ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค(์ด ๊ธฐ๋Šฅ์€ ๋ฌธ์ž ๊ทธ๋Œ€๋กœ ์ด๋ฏธ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ๊ตฌ๋ฌธ ์žฌ๋งคํ•‘์œผ๋กœ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ์Œ).

@Elephant-Vessel ๋ถ€๋ถ„ ํด๋ž˜์Šค๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ™•์žฅ ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํด๋ž˜์Šค๋Š” ์šฐ๋ฆฌ์˜ ์ œ์•ฝ ์กฐ๊ฑด์„ ๊ฐ์•ˆํ•  ๋•Œ ํ™•์žฅ ๋ฐฉ๋ฒ•์ด ์˜๋ฏธ๊ฐ€ ์žˆ๋Š” ์œ ์ผํ•œ ์žฅ์†Œ์ด๋ฉฐ ์ œ์•ˆ๋œ ES7+ ๋ฐ”์ธ๋“œ ์—ฐ์‚ฐ์ž๋Š” ํ™•์žฅ๊ณผ ์œ ์‚ฌํ•œ ๊ตฌ๋ฌธ์„ ๊ตฌ์‚ฌํ•  ์ˆ˜ ์žˆ๋Š” ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

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

@RyanCavanaugh ... ๋‚˜๋Š” C#์ด ํ•˜๋Š” ๊ฒƒ๊ณผ ๋˜‘๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๊ทธ๊ฒƒ์„ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค ... ๊ทธ๊ฒƒ์€ ์ฝ”๋“œ ์ƒ์„ฑ์— ํ›Œ๋ฅญํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค ... ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด C #์—์„œ ํ•ด๊ฒฐํ•ด์•ผ ํ•  ์ฃผ์š” ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค ... ๋‚ด ๊ธฐ์–ต์ด ํ๋ฆฟํ•˜์ง€๋งŒ ... ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ๊ณ  ๋ช‡ ๋…„ ๋™์•ˆ ์‚ฌ์šฉ๋˜์—ˆ์œผ๋ฉฐ ์ „ํˆฌ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฑฐ์ณค์Šต๋‹ˆ๋‹ค...

๋ถ€๋ถ„/ํ™•์žฅ ํด๋ž˜์Šค๊ฐ€ ์ดˆ๊ธฐํ™”๋œ ํ•„๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ถ€๋ถ„ ํด๋ž˜์Šค์— ํŠน์ •ํ•œ ๊ฒฝ๋Ÿ‰ ๊ณ„์•ฝ์ธ C#์—์„œ ์•Œ๊ณ  ์žˆ๋Š” ๋ถ€๋ถ„ ๋ฉ”์„œ๋“œ ์™€ ๊ฐ™์€ ๊ฒƒ์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ด ๋” ๊น”๋”ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ์ฒ˜๋Ÿผ:

public partial class MyGeneratedClass
 {
     partial void Initialize();
     public constructor()
     {
          //...
         this.Initialize();
    }
 }

 public partial class MyGeneratedClass
 {
     partial void Initialize()  { //... }
 }

ํƒ€์‚ฌ ํด๋ž˜์Šค๋ฅผ ๋ถ€๋ถ„ํ™”/ํ™•์žฅํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋Š” ํ•„์š”์„ฑ์€ partial/extends ์ผ๋ฐ˜์ ์œผ๋กœ ์„ ํƒ ์‚ฌํ•ญ์ด์ง€๋งŒ ๋ถ€๋ถ„ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ํ•„์ˆ˜๋กœ ๋งŒ๋“ฆ์œผ๋กœ์จ ์•„์ฃผ ์‰ฝ๊ฒŒ(?) ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ์—ฌ๊ธฐ์„œ ์›ํ•˜๋Š” ์ปจ์…‰์— ๊น”๋”ํ•œ ํ‘œํ˜„๋ ฅ๊ณผ ์กฐ์ž‘๋ ฅ์„ ๊ฐ€์ ธ๋‹ค ์ค„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋ฏน์Šค์ธ์„ ์ฐพ์œผ์‹œ๋Š” ๋ถ„๋“ค

JavaScript๊ฐ€ ์ง„ํ–‰๋˜๋Š” ํ•œ ๋ฏน์Šค์ธ์„ ์šฐ์•„ํ•˜๊ณ  ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๊ด€์šฉ์ ์œผ๋กœ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š”(๋ฐ ํ๋ฆ„ ๋ถ„์„) ์ œ์•ˆ ์„ ๊ฐ์ฒด๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

function enableBeingPositioned<a>(
   // hypothetical syntax
   something: a /* <-- before type */ => a & { x: number; y: number; } /* <-- after type */
): void { 
   something.x = 0;
   something.y = 0;
}
let value = {};
value.x; // <-- should not typecheck
enableBeingPositioned(value);
value.x; // <-- should typecheck

Java์™€ ๊ฐ™์€ ์–ธ์–ด๋Š” ๋ถ€๋ถ„ ํด๋ž˜์Šค/๊ตฌ์กฐ์ฒด๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. C#์˜ ํ‹ˆ์ƒˆ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. C# "๋ถ€๋ถ„ ํด๋ž˜์Šค/๊ตฌ์กฐ์ฒด" ๊ฐœ๋…์„ ์ตœ๋Œ€ํ•œ ๋ชจ๋ฐฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
์‚ฌ์ „ ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ TS ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ์ฒซ ๋ฒˆ์งธ ์ผ์€ ๋ฉ”๋ชจ๋ฆฌ์˜ ๋ถ€๋ถ„ ์ฝ”๋“œ ๋ธ”๋ก์„ ์Šคํ‹ฐ์นญํ•œ ๋‹ค์Œ ์ผ๋ฐ˜ ์ปดํŒŒ์ผ ํŒŒ์ดํ”„๋ผ์ธ ๊ฒฝ๋กœ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ TypeScript์˜ v1.0.0-preview1.0000 ๋ถ€๋ถ„ ํด๋ž˜์Šค ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.
C#์ด ์ œ๊ณตํ•˜๋Š” ๊ฒƒ ์ด์™ธ์˜ ๊ฒƒ์€ ๊ธฐ๋Šฅ์ด ๋ฐœ์ „ํ•˜๊ณ  ํ‰๊ฐ€ํŒ/๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ณด๋‹ค ์˜ค๋ž˜ ์ง€์†๋˜๋Š” ์ดํ›„ ๋ฒ„์ „์—์„œ ๋„์ž…๋  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ์„œ๋ฆฌ ์ผ€์ด์Šค์™€ ๋น„์Šทํ•œ ์ข…๋ฅ˜์˜ ์• ๋งคํ•œ ๋ฌผ๊ฑด์€ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์”ฉ ๋ณ„๋„๋กœ ๋…ผ์˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋‚˜์ค‘์— ์ ํ•ฉ์„ฑ ๋ฐ ๋งˆ๊ฐ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. IMO.

๋˜ํ•œ ๋ถ€๋ถ„ ๋ฐ ํ™•์žฅ ํด๋ž˜์Šค๋ฅผ C# ๋ฐฉ์‹์œผ๋กœ ์ •ํ™•ํžˆ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.
๊ตฌ๋ฌธ ๋ฐ ์˜๋ฏธ ์ธก๋ฉด์—์„œ ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๊นŒ? ๋‘˜ ๋‹ค ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?
๊ฐ๊ฐ์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋งค์šฐ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ๋ถ€๋ถ„ ์ˆ˜์—…์€ ํ–ฅ์ƒ
์ƒ์„ฑ๋œ ์ฝ”๋“œ์˜ ์œ ์šฉ์„ฑ ํ™•์žฅ ๋ฐฉ๋ฒ•์€ ์‚ฌ์šฉ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.
์ธํ„ฐํŽ˜์ด์Šค, ์ง€์ •๋œ ์ œ๋„ค๋ฆญ ๋ฐ ์„ธ ๋ฒˆ์งธ์—์„œ ์ž‘๋™ํ•˜๋Š” ์ •์  ๋ฉ”์„œ๋“œ
ํŒŒํ‹ฐ ์œ ํ˜•. ๋‘˜ ๋‹ค ์ •๋ง ๋ฉ‹์ง€์ง€๋งŒ ๋‘˜ ๋‹ค ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•˜์‹ญ์‹œ์˜ค.
์œ„์˜ ์ œ์•ˆ๋œ ๊ตฌ๋ฌธ ๋•Œ๋ฌธ์— ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ์—ฌ๊ธฐ์—์„œ ๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ™•์žฅ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(ํ˜•์‹ ์ง€์ • ๋ถ€์กฑ,
์ „ํ™”๋กœ ์ž…๋ ฅ):

ํ™•์žฅ MyType[] {
๋ญ”๊ฐ€ ํŠน์ •ToMyType() { ... }
}

WeirdThirdParty๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ํ™•์žฅ{
๊ฐ™์€์—ฌ๊ธฐ() { ... }
}

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

๋„ˆ๋ฌด ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค - ๋‘˜์„ ํ•˜๋‚˜์˜ ๋™์ผํ•œ ๊ฒƒ์œผ๋กœ ์ทจ๊ธ‰ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๋‘˜ ๋‹ค ๋งค์šฐ
๋ฉ‹์ง€์ง€๋งŒ ๊ฐ™์€ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ๋‘˜ ๋‹ค ์šฐ๋ฆฌ์˜
์–ธ์–ด.

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

  • ๊ฒŒ์ž„๊ณผ ๊ฐ™์ด ์„ฑ๋Šฅ์— ๋ฏผ๊ฐํ•œ ํ”„๋กœ์ ํŠธ์—์„œ
    ์œ ์šฉํ•œ ์ž‘์—…์œผ๋กœ CPU ์˜ˆ์‚ฐ์„ ์ตœ๋Œ€ํ™”ํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ, codegen์€ ๋งŽ์€ ๋„์›€์„ ์ค๋‹ˆ๋‹ค.
    ์ถ”๋ก ํ•˜๊ธฐ ์‰ฝ๊ณ  ๊ณ ๋„๋กœ ์ตœ์ ํ™” ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ ์ƒ์„ฑ
    / ์ •๋ง ์ž˜ ๋‚˜๊ฐ€๋Š” ๋ชจ๋…ธ๋ชจํ”ฝ ์ฝ”๋“œ. ์˜ˆ๋ฅผ ๋“ค์–ด,
    ์—”ํ‹ฐํ‹ฐ/์ปดํฌ๋„ŒํŠธ ๊ฒŒ์ž„ ์—”์ง„, ์ƒ์„ฑ๋œ ์ฝ”๋“œ๋Š” ์ˆ˜๋งŽ์€ ์ž‘์—…์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํ•จ๊ป˜ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋งค์šฐ ๋น ๋ฅธ ์ƒ์šฉ๊ตฌ ์ฝ”๋“œ, ์ด๋ฒคํŠธ
    ํŒŒ๊ฒฌ ๋“ฑ
  • ๋Œ€๊ทœ๋ชจ ๋น„์ฆˆ๋‹ˆ์Šค ์•ฑ์—์„œ ์ƒ์„ฑ๋œ ์ฝ”๋“œ๋Š” ์ตœ๋Œ€ ๋งˆ์ผ๋ฆฌ์ง€๋ฅผ ์–ป๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.
    ์œ ํ˜• ์‹œ์Šคํ…œ, ์˜ˆ๋ฅผ ๋“ค์–ด ๋งค์šฐ ๊ตฌ์ฒด์ ์ธ
    ์ปดํŒŒ์ผ ์‹œ๊ฐ„์„ ์ตœ๋Œ€ํ™”ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ ๋“ฑ์˜ ์„œ๋ช…
    ํ™•์ธํ•˜๊ณ  ๋ฆฌํŒฉํ† ๋ง์„ ๋•๊ณ  ๋””๋ฒ„๊น…์„ ํฌ๊ฒŒ ๋‹จ์ˆœํ™”ํ•ฉ๋‹ˆ๋‹ค.
    ๋งค์šฐ ๊ฐ„๋‹จํ•œ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ์ฝ”๋“œ๋ฅผ ๋‹จ๊ณ„๋ณ„๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
  • ํฐ ๋ฌธ์ œ๋Š” ์ผ๋ถ€ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋™๊ธฐํ™”๋œ ์ƒํƒœ๋กœ ์œ ์ง€ํ•  ๋•Œ์ž…๋‹ˆ๋‹ค.
    ์—ฌ๋Ÿฌ ์–ธ์–ด ํ™˜๊ฒฝ(์˜ˆ: ๋ฉ”์‹œ์ง•๊ณผ ๊ด€๋ จ๋œ ๊ฒƒ)
    ํ”„๋กœํ† ์ฝœ ๋ฒ„ํผ ๋˜๋Š” json ๋ฉ”์‹œ์ง€ ์ธํ„ฐํŽ˜์ด์Šค ๋“ฑ

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

C#์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ด ๊ฐœ๋…์˜ ์ž˜ ์•Œ๋ ค์ ธ ์žˆ๊ณ  ์‹œ๋„๋œ ๋ชจ๋ธ์— ๋”ฐ๋ผ ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์•„์ด๋””์–ด๊ฐ€ ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค. '๋ชจ๋ฐฉ'์€ ๋ถ€์ •์ ์ธ ์˜๋ฏธ๋ฅผ ๋‚ดํฌํ•˜๊ณ  ์žˆ์ง€๋งŒ ์ง€๋Šฅ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋ฉด ์ƒ๋‹นํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— '์ง€๋Šฅ์ ์ธ' ๋ถ€๋ถ„์€ ๋‹ค์–‘ํ•œ ์ƒํ™ฉ๊ณผ ์ œํ•œ ์‚ฌํ•ญ์„ ์ธ์‹ํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ TypeScript์˜ ๋ถ€๋ถ„์ด C#์˜ ๋ถ€๋ถ„๊ณผ ์ •ํ™•ํžˆ ๊ฐ™์ง€ ์•Š์€ ๊ฒฝ์šฐ ํ•ญ์˜ํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค.

@Elephant-Vessel, ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด C# ๋ถ€๋ถ„์˜ ์‚ฌ๋ณธ์ด ๋  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ๋””์ž์ธ์€ C# ๋ถ€๋ถ„์—์„œ ์ตœ๋Œ€ํ•œ์˜ ์˜๊ฐ์„ ์–ป์œผ๋ฉด์„œ TypeScript/JavaScript๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ๋จผ์ € ์ œ์ž‘๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์ œ์•ˆ์€ ' partial ํ‚ค์›Œ๋“œ ๋“ฑ๋ก' ๋ฐ '๋ถ€๋ถ„ ์—ฐ๊ฒฐ'์„ ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์‹คํ—˜์ /๋ฏธ๋ฆฌ๋ณด๊ธฐ ๊ธฐ๋Šฅ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(๊ทธ๋ž˜์„œ ์†Œ๋น„์ž๋Š” ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ์—์„œ ์ด์— ์˜์กดํ•˜๊ธฐ ์‹œ์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐฉ๋ง์ด์—์„œ). ๋‚˜์ค‘์— ์ปค๋ฎค๋‹ˆํ‹ฐ ์‘๋‹ต์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ”„๋กœ๋•์…˜ ์ค€๋น„ ๋ฐ RTM์ด ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋Šฅ์„ ๋ฐœ์ „์‹œํ‚ต๋‹ˆ๋‹ค. ๋ชจ๋“  ์ข…๋ฅ˜์˜ ๊นŒ๋‹ค๋กœ์šด ๋ฌธ์ œ์™€ ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋Œ€ํ•ด ๋ฏธ๋ฆฌ ๊ฑฑ์ •ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ๋” ์ง€์—ฐ๋  ๊ฐ€๋Šฅ์„ฑ์ด ํฝ๋‹ˆ๋‹ค.

+1 - ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋ฅผ ํ™•์žฅํ•˜๊ณ  ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

์ƒ์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ +1

polyfill์„ ๋งŒ๋“ค๊ณ  ํฐ ํด๋ž˜์Šค๋ฅผ ๋‚˜๋ˆด์Šต๋‹ˆ๋‹ค.

ํด๋ž˜์Šค๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

export class C {
  constructor() {
  }
}
export interface C {
  m(): void;
}

ํด๋ž˜์Šค ๋ฉค๋ฒ„๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

export default class extends C {
  m(): void {
  }
}

๊ตฌํ˜„์„ ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

import {C} from './core';
import m from './member/m';

compose(C, m);
export {C}
import {assign} from './assign';
import {concat} from './concat';

export function compose<T extends new (...args: any[]) => any>(target: T, ...sources: T[]): T {
  return concat([target], sources)
    .reduce((b, d) => {
      void assign(b.prototype, d.prototype);
      for (const p in d) if (d.hasOwnProperty(p)) b[p] = d[p];
      return b;
    });
}

https://github.com/falsandtru/spica/commit/a6ff30da5319db5f25f703a29da48fc0f7dbe2fe

๋‚˜๋Š” ์ด๊ฒƒ์ด ํ•˜๋‚˜์˜ ํŠน์ •ํ•œ ์ด์œ  ๋•Œ๋ฌธ์— ๋”์ฐํ•œ ์ƒ๊ฐ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ „์—ญ, ์ฃผ๋ณ€, ์™ธ๋ถ€, ์ด๋ฆ„ ๊ณต๊ฐ„ ๋ฐ ์ทจ์•ฝ ์„ ์–ธ ์ˆœ์„œ ์ข…์† ์ƒ์† ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ด๋ฏธ ๋ณต์žกํ•œ ๊ทœ์น™์„ ํ›จ์”ฌ ๋” ์•…ํ™”์‹œํ‚ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ C#์ด ์•„๋‹ˆ๋ฉฐ ์ด๋ฆ„ ํ™•์ธ ๋ฐ ๋ฉค๋ฒ„ ์„ ์–ธ์ด ๋งค์šฐ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

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

๋˜ํ•œ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑ๋œ ์ฝ”๋“œ์™€ ์†์œผ๋กœ ์ž‘์„ฑํ•œ ์ฝ”๋“œ ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์†”๋ฃจ์…˜์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ด๊ฒƒ๋„ TS์— ์ถ”๊ฐ€๋˜๋ฉด ์ข‹๊ฒ ๋„ค์š”

์ฝ”๋“œ ์ƒ์„ฑ ๋ชฉ์ ์œผ๋กœ +1(์ถ”๊ฐ€ ๋ถ€๋ถ„ ํด๋ž˜์Šค ์ •์˜๊ฐ€ ์žˆ๋Š” WCF ์„œ๋น„์Šค ์ฐธ์กฐ์˜ DTO)

์ฝ”๋“œ ์ƒ์„ฑ ๋ชฉ์ ์œผ๋กœ +1. ๋‚ด ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. render() ํ•จ์ˆ˜๊ฐ€ react-templates ๋ฅผ ํ†ตํ•ด ์™ธ๋ถ€์ ์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” React ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

partial ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜์™€ ๊ธฐ๋ณธ ํด๋ž˜์Šค( Component )๋ฅผ ๋น„๊ตํ•˜์—ฌ ์œ ํ˜•์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถ€๋ถ„ ํด๋ž˜์Šค๊ฐ€ ์—†์œผ๋ฉด ๋‚ด๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ์ผ์€ ํ•จ์ˆ˜๋ฅผ ๋ฉ”์ธ ํด๋ž˜์Šค์— ๋ฐ”์ธ๋”ฉํ•˜๊ณ  ์ตœ์„ ์„ ๋‹คํ•˜๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ TS 2.0์—์„œ๋Š” ์ผ๋ถ€ ์ฝ”๋“œ ์ƒ์„ฑ ์‚ฌ๋ก€๊ฐ€ this ์œ ํ˜• ๊ธฐ๋Šฅ์œผ๋กœ ์ฒ˜๋ฆฌ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์•ž์—์„œ ์„ค๋ช…ํ•œ ๊ฒฝ์šฐ ๋Œ€์‹ 

partial class MyComponent extends React.Component<any,any> {
    render() {
        ...
    }
}

๋‚œ ์“ธ์ˆ˜์žˆ๋‹ค

function render<this extends MyComponent>()
        ...
}
MyComponent.prototype.render = render;

+1 ๊ฐœ๋ฐœ์ž๋กœ์„œ ์—ฌ๋Ÿฌ ํ…œํ”Œ๋ฆฟ์ด ์—ฌ๋Ÿฌ ํŒŒ์ผ์— ๋ถ„์‚ฐ๋œ ๋™์ผํ•œ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑ/์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ถ€๋ถ„ ํด๋ž˜์Šค๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ์˜๊ฒฌ์€ ํŠนํžˆ ๋ฏน์Šค์ธ์ด ์•„๋‹Œ ๋ถ€๋ถ„ ํด๋ž˜์Šค์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‘˜์€ ๊ทผ๋ณธ์ ์œผ๋กœ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋ถ€๋ถ„ ํด๋ž˜์Šค๋Š” ๋ฌผ๋ฆฌ์  ์ฝ”๋“œ๋ฅผ ๋ถ„ํ•ดํ•˜๋Š” ๊ฒƒ์ด๊ณ , ๋ฏน์Šค์ธ์€ ๋…ผ๋ฆฌ์  ๋™์ž‘์„ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํŠน์„ฑ์œผ๋กœ ๋ถ„ํ•ดํ•˜์—ฌ ์œ ํ˜•๊ณผ ๊ฐ’ ์ˆ˜์ค€ ๋ชจ๋‘์—์„œ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ํ’๋ถ€ํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋‚˜๋Š” ๋ถ€๋ถ„ ํด๋ž˜์Šค๊ฐ€ TypeScript์— ์ข‹์€ ์•„์ด๋””์–ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— Mixins๋Š” @aleksey-bykov๊ฐ€ ์ง€์ ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ TypeScript์˜ ์œ ํ˜• ์‹œ์Šคํ…œ๊ณผ JavaScript ๊ด€์šฉ๊ตฌ ๋ชจ๋‘์—์„œ ํ–ฅ์ƒ๋œ ํ‘œํ˜„๋ ฅ๊ณผ ๋ฉ”์‰ฌ๋ฅผ ๋งค์šฐ ์ž˜ ์ œ๊ณตํ•˜๋Š” ์ข‹์€ ์•„์ด๋””์–ด์ž…๋‹ˆ๋‹ค.

@wendelm ์€ ES ๋ชจ๋“ˆ์ด ๋ฌผ๋ฆฌ์ ์ด๋ผ๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊นจ๋—ํ•œ ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋ถ€๋ถ„ ํด๋ž˜์Šค๋Š” ๋ชจ๋“ˆ์ด ๋ฌผ๋ฆฌ์ ์ด์ง€ ์•Š๊ณ  ๋…ผ๋ฆฌ์ ์ธ C#๊ณผ ๊ฐ™์€ ์–ธ์–ด์—์„œ ์ž˜ ์ž‘๋™ํ•˜๋ฉฐ ๋งŽ์€ ์˜๋ฏธ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. CLR์˜ ๊ด€์ ์—์„œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹จ์ง€ ํด๋ž˜์Šค ์ด๋ฆ„์— ์ ์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค(@ahejlsberg์™€์˜ ์ธํ„ฐ๋ทฐ ์ถœ์ฒ˜).

+1 ๋ถ€๋ถ„ ์ˆ˜์—…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค!

์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” Swift์™€ ๊ฐ™์ด ๊ตฌํ˜„๋œ ๊ธฐ๋Šฅ์ด ์žˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

interface Rect {
    x: number
    y: number
}

extension Rect {
    area() => this.x * this.y
}

์Šค์œ„ํ”„ํŠธ ๋ฒ„์ „:

protocol Rect {
    var x: Float {get}
    var y: Float {get}
}
extension Rect {
    func area() -> Float {
        return self.x * self.y
    }
}

+1

์ฝ”๋“œ ์ƒ์„ฑ๊ณผ ๋ถ€๋ถ„ ํด๋ž˜์Šค๋Š” ํ•จ๊ป˜ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.

์ƒ์†์€ ๋ณธ์งˆ์ ์œผ๋กœ ๋ฏธํ™”๋˜๋Š” #include ์ง€์‹œ๋ฌธ์— ๋Œ€ํ•œ ๋นˆ์•ฝํ•œ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค.

Angular 2๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ƒ์œ„ ํด๋ž˜์Šค์—์„œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ฅผ

@tsvetomir TypeScript ๋ฌธ์ œ๊ฐ€ ์•„๋‹Œ Angular ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

์ƒ์†์€ ๋ณธ์งˆ์ ์œผ๋กœ ๋ฏธํ™”๋˜๋Š” #include ์ง€์‹œ๋ฌธ์— ๋Œ€ํ•œ ๋นˆ์•ฝํ•œ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค.

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

Typescript๋Š” "Angular" ์–ธ์–ด๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค...

2016๋…„ 7์›” 23์ผ ์˜คํ›„ 9์‹œ 46๋ถ„์— Aluan Haddad < [email protected] [email protected] >์ด(๊ฐ€) ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

@tsvet omirhttps://github.com/tsvetomir ์ด๋Š”

์ƒ์†์€ ๋ณธ์งˆ์ ์œผ๋กœ ๋ฏธํ™”๋˜๋Š” #include ์ง€์‹œ๋ฌธ์— ๋Œ€ํ•œ ๋นˆ์•ฝํ•œ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค.

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

๋‹น์‹ ์ด ๋Œ“๊ธ€์„ ๋‹ฌ์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ Gi tHubhttps://github.com/Microsoft/TypeScript/issues/563#issuecomment -234753589์—์„œ ํ™•์ธํ•˜๊ฑฐ๋‚˜ ์ฝ๊ธฐ๋ฅผ ์Œ์†Œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค .https://github.com/notifications/unsubscribe-auth/AJPCIh7n2_0dt00kw- XJv7tc9LB0tPsIks5qYtH4gaJpZM4CcixK.

์–ด๋–ค ์‹์œผ๋กœ๋“  Angular์™€ ๊ด€๋ จ๋œ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ถ€๋ถ„ ์ˆ˜์—…์ด ๋„์›€์ด ๋˜์—ˆ์„ ์ˆ˜ ์žˆ๋Š” ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

์ด ์š”์ฒญ์€ C#์— ๋Œ€ํ•œ ๊ณผ๊ฑฐ ๊ฒฝํ—˜๊ณผ ์นœ์ˆ™ํ•œ ๊ธฐ๋Šฅ์˜ ๋ถ€์กฑ์—์„œ ๋น„๋กฏ๋ฉ๋‹ˆ๋‹ค. TypeScript ๋Š” .NET๊ณผ ๊ฑฐ๋ฆฌ๋ฅผ ๋‘๋ ค๊ณ 

์ด ์š”์ฒญ์€ C#์— ๋Œ€ํ•œ ๊ณผ๊ฑฐ ๊ฒฝํ—˜๊ณผ ์นœ์ˆ™ํ•œ ๊ธฐ๋Šฅ์˜ ๋ถ€์กฑ์—์„œ ๋น„๋กฏ๋ฉ๋‹ˆ๋‹ค. TypeScript๊ฐ€ .NET๊ณผ ๊ฑฐ๋ฆฌ๋ฅผ ๋‘๋ ค๊ณ  ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋น„๊ต๋Š” ๋ถˆ๊ฐ€ํ”ผํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ์–ด๋–ค ํ˜•ํƒœ์˜ ๊ธฐ๋Šฅ ํŒจ๋ฆฌํ‹ฐ๋ฅผ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

@tsvetomir ๋Š” ์˜ค๋žœ .NET ๊ฐœ๋ฐœ์ž์ด์ž ์—ด์ •์ ์ธ C# ํ”„๋กœ๊ทธ๋ž˜๋จธ๋กœ์„œ ๊ทผ๋ณธ์ ์œผ๋กœ ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ธ์šฉํ•œ ๊ธฐ์‚ฌ๋Š” ๊ถŒ์œ„๊ฐ€ ์—†์œผ๋ฉฐ TypeScript ํŒ€์˜ ๊ณต์‹ ์ž๋ฃŒ๋ฅผ ๋ฐ˜์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ @ahejlsberg ๊ฐ€ ์ˆ˜๋งŽ์€ ๋Œ€ํ™”, ์ธํ„ฐ๋ทฐ ๋ฐ ๊ฒŒ์‹œ๋ฌผ์—์„œ ์–ธ๊ธ‰ํ•œ

๋˜ํ•œ ์ธ์šฉ๋œ ๊ธฐ์‚ฌ์˜ ๊ด€์ ์€ TypeScript์˜ ๋ณธ์งˆ์— ๋Œ€ํ•œ ๊ทผ๋ณธ์ ์ธ ์˜คํ•ด๋ฅผ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.
์•„์ด๋Ÿฌ๋‹ˆํ•˜๊ฒŒ๋„ C#์ด TypeScript์™€ ๊ฐ–๋Š” ๊ณตํ†ต์ ์€ ์‹ค์ œ๋กœ JavaScript์—์„œ์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.
์ด๋Ÿฌํ•œ ๊ณตํ†ต์ ์€ ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ์•„๋‹ˆ๋ผ ํด๋กœ์ € ๋ฐ ๊ณ ์ฐจ ํ•จ์ˆ˜์™€ ๊ฐ™์€ ๊ตฌ์„ฑ์ž…๋‹ˆ๋‹ค.

C#์ด๋“  ์•„๋‹ˆ๋“  TypeScript๊ฐ€ Javascript์˜ ํ”„๋กœํ† ํƒ€์ž… ๊ธฐ๋Šฅ์— ๋” ๊ฐ€๊นŒ์›Œ์ง€๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ๋ถ€๋ถ„ ํด๋ž˜์Šค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

@yahiko00
TypeScript์—๋Š” ์ด๋ฏธ JavaScript์˜ ๋ชจ๋“  ํ”„๋กœํ† ํƒ€์ž… ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
์Šˆํผ์„ธํŠธ์ž…๋‹ˆ๋‹ค.

TypeScript์˜ ๋ถ€๋ถ„ ํด๋ž˜์Šค ๊ฐœ๋…์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. C#๊ณผ ๋‹ฌ๋ฆฌ TypeScript(JavaScript) ํด๋ž˜์Šค ์ •์˜๋Š” ์„ ์–ธ์ ์ด ์•„๋‹ˆ๋ผ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค. ์„ ์–ธ์ ์œผ๋กœ ๋ณด์ด์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ทธ๋“ค์ด ๊ฒฐ์ •์  ์‹คํ–‰ ์ˆœ์„œ์— ์˜์กดํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  2. ECMAScript ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์€ ๋…ผ๋ฆฌ์  ์ฝ”๋“œ ๋‹จ์œ„๊ฐ€ ์•„๋‹Œ ๋ฌผ๋ฆฌ์  ์ฝ”๋“œ ๋‹จ์œ„ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.
    ์˜ˆ๋ฅผ ๋“ค์–ด ๋‚ด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ • ํ•ด ๋ด…์‹œ๋‹ค.

_app/my-class-part-1.ts_

TypeScript export partial class MyClass { firstName = "John"; lastName = "Smith"; }

๊ทธ๋ฆฌ๊ณ 
_app/my-class-part-2.ts_

TypeScript export partial class MyClass { fullName = this.firstName + ' ' + this.lastName; }

์ด ํด๋ž˜์Šค๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์–ด๋Š ๋ชจ๋“ˆ์—์„œ๋„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋‹ค์Œ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” TypeScript์˜ ๊ฐ€์ƒ ์ถ”์ƒํ™”๋ฅผ ์ƒ์ƒํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
_์•ฑ/๋ฉ”์ธ.ts_

TypeScript import { MyClass } from './my-class';

์ด๊ฒƒ์€ ๋ฌด์—‡์„ ์˜๋ฏธํ• ๊นŒ์š”? TypeScript ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ _app/my-class-part-1.ts_๊ฐ€ _app/my-class-part-2.ts_๋ณด๋‹ค ๋จผ์ € ๋กœ๋“œ๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ๋”๋ผ๋„ ๊ฐœ๋ณ„ ๋ถ€๋ถ„์˜ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ๋ฌดํšจํ™”ํ•˜๊ฑฐ๋‚˜ ๋ณด์žฅํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์€ RequireJS์™€ ๊ฐ™์€ ๋น„๋™๊ธฐ ๋ชจ๋“ˆ ๋กœ๋”์— ์˜ํ•ด ์˜ฌ๋ฐ”๋ฅธ ์ˆœ์„œ๋กœ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ๊ฒฐ๊ตญ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ตฌํ˜„๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ถ€๋ถ„ ํด๋ž˜์Šค์˜ ์ „์ฒด ๊ฐœ๋…์€ ๊ทผ๋ณธ์ ์œผ๋กœ ECMAScript ๋ชจ๋“ˆ ์‹œ์Šคํ…œ๊ณผ ๋ชจ์ˆœ๋ฉ๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ: ์ž„์˜๋กœ ๋ณต์žกํ•œ ์ข…์†์„ฑ ์ถ”๋ก ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋งค์šฐ ์ด์ƒํ•œ JavaScript๋ฅผ ๋‚ด๋ณด๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

TypeScript์—๋Š” ์ด๋ฏธ JavaScript์˜ ๋ชจ๋“  ํ”„๋กœํ† ํƒ€์ž… ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
์Šˆํผ์„ธํŠธ์ž…๋‹ˆ๋‹ค.

๋” ์ž˜ ํ‘œํ˜„ํ–ˆ์–ด์•ผ ํ–ˆ๋‹ค. ๋ฌผ๋ก  TypeScript๊ฐ€ JavaScript์˜ ์ƒ์œ„ ์ง‘ํ•ฉ์ด๋ผ๋Š” ๊ฒƒ์€ ๋ชจ๋‘ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Partial ํด๋ž˜์Šค๋Š” TypeScript ํด๋ž˜์Šค๊ฐ€ JS ํ”„๋กœํ† ํƒ€์ž…์— ๋” ๊ฐ€๊นŒ์›Œ์ง€๋Š” ๋ฐ ๋„์›€์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ๋งํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ๋กœ์„œ๋Š” "์ •์ " ๋ฐ ํ™•์žฅ ๋ถˆ๊ฐ€๋Šฅํ•œ ํด๋ž˜์Šค๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ ํ”„๋กœํ† ํƒ€์ž… ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ํด๋ž˜์Šค์™€ ์œ ์‚ฌํ•œ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถ€๋ถ„ ํด๋ž˜์Šค๋ฅผ ๊ฐ€์ ธ์˜ค๋ฉด ๋‚ด๊ฐ€ ๋™์˜ํ•˜๋Š” ํ˜„์žฌ ES6 ๊ตฌ๋ฌธ์ด ํ™•์žฅ๋ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import { MyClass } from ['app/my-class-part-1', 'app/my-class-part-2'];

TypeScript ํด๋ž˜์Šค๋Š” ECMAScript ํด๋ž˜์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฏ€๋กœ ํ›„์ž์˜ ํ‘œํ˜„๋ ฅ ๋ถ€์กฑ์œผ๋กœ ์–ด๋ ค์›€์„ ๊ฒช์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜, ๋ชจ๋“ˆ, "๋„ค์ž„์ŠคํŽ˜์ด์Šค" ๋˜๋Š” ์ผ๋ฐ˜ ๊ฐœ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•„์š”ํ•œ ๊ฒƒ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

ํ•จ์ˆ˜๋Š” ํด๋ž˜์Šค ๊ฐœ๋…์œผ๋กœ ํ”ผํ•˜๊ณ  ์‹ถ์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋ชจ๋“ˆ์ด๋‚˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” ๋‹จ์ˆœํ•œ ํ™•์žฅ์„ฑ์„ ๊ฐ€์ ธ์˜ค๊ณ  TypeScript์˜ ํด๋ž˜์Šค์™€ ๊ฐ™์€ ํ‘œํ˜„๋ ฅ์„ ๊ฐ–์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋‚˜ ๋ชจ๋“ˆ์€ ์ธ์Šคํ„ด์Šคํ™”ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํด๋ž˜์Šค์™€ ๋™์ผํ•œ ๋ชฉ์ ์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@aluanhaddad ๋ชจ๋“ˆ๊ณผ ๊ด€๋ จํ•˜์—ฌ ๋ฌด์Šจ ๋ง์”€์ด์‹ ์ง€ export partial class ์— ํ—ˆ์šฉํ•˜๊ณ  ๋‚˜๋จธ์ง€๋Š” partial class ์ •์˜๋งŒ ํฌํ•จํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด๋ณด๋‚ธ ๊ณณ์—์„œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ์˜ˆ์—์„œ :

_app/my-class.ts_

export partial class MyClass {
    firstName = "John";
    lastName = "Smith";
}

_app/my-class.part.ts_

partial class MyClass {
    get fullName(): string {
        return this.firstName + ' ' + this.lastName;
    }
}

_์•ฑ/๋ฉ”์ธ.ts_

import { MyClass } from './my-class';

๋ˆ„๋ฝ๋œ ๊ฒƒ์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ถ€ํ’ˆ์„ ์ฐพ์„ ์œ„์น˜๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ๊ตฌ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ชจ๋“  ํŒŒ์ผ์„ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•˜๋Š” C#์˜ ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์„ ์–ธ ๋ณ‘ํ•ฉ์— ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ํŠน๋ณ„ํ•œ ๊ตฌ๋ฌธ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

Module Augmentation ์ด ์ด๋Ÿฌํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค์— ์œ ํšจํ•˜์ง€ ์•Š์€ ์ด์œ ๋ฅผ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Rxjs5์—์„œ๋Š” ๋งค์šฐ ์ž˜ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•œ ๋‹ค์Œ ์ฝ”๋“œ ์ƒ์„ฑ๊ณผ ํ•จ๊ป˜ ๊ธฐ๋ณธ ํด๋ž˜์Šค ์œ„์— ํ•„์š”ํ•œ ๋ชจ๋“  ์ฆ๊ฐ• ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ๋œ ์ฝ”๋“œ๊ฐ€ ์˜ˆ์˜๋”๋ผ๋„ ์•„๋ฌด ์ธ๊ฐ„๋„ ์ž‘์„ฑํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

๋ถ€๋ถ„ ์ˆ˜์—…์„ ์™„๋ฒฝํ•˜๊ฒŒ ๋Œ€์ฒดํ•ฉ๋‹ˆ๊นŒ? ๋‚˜๋Š” ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ECMAScript๊ฐ€ JavaScript๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ๊ฒฐ์ •ํ•˜์ง€ ์•Š๋Š” ํ•œ ๋ถ€๋ถ„ ํด๋ž˜์Šค๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ถ€๋ถ„ ํด๋ž˜์Šค๊ฐ€ ์™ธ๋ถ€ ๋ชจ๋“ˆ ์‚ฌ์ด์— ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ์˜๋ฏธ๋ก ๋งŒ์œผ๋กœ๋„ ๋จธ๋ฆฌ๊ฐ€ ์•„ํ”•๋‹ˆ๋‹ค.

@david-driscoll์„ ๋” ์ข‹๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€๋œ ๋ฉ”์„œ๋“œ๋Š” ๋” ๊ฐ•๋ ฅํ•œ ์œ ํ˜• ๊ฒ€์‚ฌ๋ฅผ ์œ„ํ•ด this: ์ธ์ˆ˜๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Module Augmentation ์˜ ์ธ์šฉ๋œ ์˜ˆ์—์„œ:

// observable.ts stays the same
// map.ts
import { Observable } from "./observable";
declare module "./observable" {
    interface Observable<T> {
        map<U>(f: (x: T) => U): Observable<U>;
    }
}
Observable.prototype.map = function (this: Observable, f) {
    // here "this" has the shape of the "Observable" class
}

์‘. Rxjs๋Š” 2.0 ๊ธฐ๋Šฅ์ด๊ณ  2.0์ด ์•„์ง ๋ฆด๋ฆฌ์Šค๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์•„์ง ์กฐ์šฉํžˆ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‚˜์ค‘์— ๋‚ด ํžˆํŠธ ๋ชฉ๋ก์— ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์ด ๋ชจ๋“ˆ์— ๋Œ€ํ•ด ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ์†”๋ฃจ์…˜์€ ํŒŒ์ผ ์ค‘ ํ•˜๋‚˜๋งŒ ๋ถ€๋ถ„ ํด๋ž˜์Šค๋ฅผ ๋‚ด๋ณด๋‚ด๊ณ  ๋‚˜๋จธ์ง€๋Š” ๋ถ€๋ถ„ ํด๋ž˜์Šค ์ •์˜๋งŒ ํฌํ•จํ•˜๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด๋ณด๋‚ธ ๊ณณ์—์„œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ์˜ˆ์—์„œ :

_app/my-class.ts_

export partial class MyClass {
    firstName = "John";
    lastName = "Smith";
}

์•ฑ/my-class.part.ts

partial class MyClass {
    get fullName(): string {
        return this.firstName + ' ' + this.lastName;
    }
}

๋‚˜๋Š” ๊ตฌ๋ฌธ์  ๊ฐœ๋…์„ ์ข‹์•„ํ•˜์ง€๋งŒ ๋ฌธ์ œ๋Š” ์ผ์ข…์˜ ์•”์‹œ์  ๋ชจ๋“ˆ๋กœ ์†Œ๋น„๋˜๊ณ  ์Šคํฌ๋ฆฝํŠธ์ฒ˜๋Ÿผ ๋ณด์ด๊ณ  ํŠน์ • ๋ฐฉ์‹์œผ๋กœ ๋กœ๋“œ๋˜์–ด์•ผ ํ•˜๋Š” ์ƒˆ๋กœ์šด _์ข…๋ฅ˜_์˜ ์†Œ์Šค ํŒŒ์ผ์„ ๋ฐฉ๊ธˆ ๋„์ž…ํ–ˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ˆ„๋ฝ๋œ ๊ฒƒ์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ถ€ํ’ˆ์„ ์ฐพ์„ ์œ„์น˜๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ๊ตฌ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ชจ๋“  ํŒŒ์ผ์„ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•˜๋Š” C#์˜ ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์„ ์–ธ ๋ณ‘ํ•ฉ์— ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ํŠน๋ณ„ํ•œ ๊ตฌ๋ฌธ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„ ์–ธ ๋ณ‘ํ•ฉ์€ ์†Œ์Šค ํŒŒ์ผ์ด ์•„๋‹Œ _declarations_์— ๋Œ€ํ•ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

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

์ด ๋ชจ๋“  ๊ฒƒ์€ _are_ ์ผ๋ฐ˜์ ์œผ๋กœ ์ˆœ์„œ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

ํŽธ์ง‘: ์ฆ‰, ์ •์˜ํ•˜๋ฉด ํด๋ž˜์Šค๊ฐ€ ์ˆ˜์ •๋ฉ๋‹ˆ๋‹ค.

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

BTW: ๋ˆ„๊ตฐ๊ฐ€ C# ํด๋ž˜์Šค์—์„œ TS ์œ ํ˜•์„ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ TypeScriptBuilder ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณ ๋ คํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

TypeScriptBuilder๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ;)

๋‚˜์˜ ์ œ์•ˆ...

์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ชจ๋“  ๋ถ€๋ถ„์„ ์ฐพ์œผ๋ ค๊ณ  ํ•˜์ง€ ์•Š์œผ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? ๋‹ค๋ฅธ ๋ถ€ํ’ˆ์„ ๊ฐ€์ ธ์™€์„œ ๋ชจ๋“  ๊ฒƒ์„ ์ œ์–ดํ•ด์•ผ ํ•œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

/MyClass.partial.ts

export partial class MyClass {
    firstName = "John";
    lastName = "Smith";
}

MyClass.ts

// v- this would NOT throw an error because the definition is marked as partial
import { MyClass } from "./MyClass.partial";

export class MyClass {
    get fullName(): string {
        return this.firstName + ' ' + this.lastName;
    }
}

๊ทธ ๋‹ค์Œ์—...

  1. ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ MyClass ๋‚˜๋Š”๋กœ๋ถ€ํ„ฐ ๊ฐ€์ ธ์˜ฌ ํ•„์š”๊ฐ€ MyClass.ts
  2. ์ปดํŒŒ์ผ๋˜๋ฉด MyClass.partial.ts ๋Š” ์ด์ „์— ์—ฌ๊ธฐ์— ํ‘œ์‹œ๋œ ๊ฒƒ์ฒ˜๋Ÿผ MyClass.prototype ๋ฅผ ํ™•์žฅํ•˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ™•์žฅํ•  ํ”„๋กœํ† ํƒ€์ž…์„ ๋ฐ›๋Š” ํ•จ์ˆ˜๋ฅผ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค.
  3. MyClass.partial.ts MyClass ๊ฐ€ ์ •์˜๋œ ํ›„ MyClass MyClass MyClass.partial.ts ๋ฅผ import ํ•˜๊ณ  ํ™•์žฅ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ... ์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉํ•ดํ•˜๋Š” ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” Typescript์˜ ๋ชจ๋“  ์œ„๋Œ€ํ•จ์„ ์žƒ์–ด๋ฒ„๋ ธ์Šต๋‹ˆ๋‹ค.

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

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

์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ด ๋ชจ๋“  ๊ฒƒ์„ ์ถ”์ ํ•˜๋Š” ๊ฒƒ์€ ๊นŒ๋‹ค๋กœ์šธ ์ˆ˜ ์žˆ์ง€๋งŒ ์•„๋งˆ๋„ ๋‹น์‹ ์ด ์ œ์•ˆํ•œ ๋Œ€๋กœ ๋ช…์‹œ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถ€๋ถ„ ํด๋ž˜์Šค ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ํ•ด๋‹น ๊ฐœ์„  ์‚ฌํ•ญ์—์„œ ๋น ์ง€๋ฉด์„œ ์œ ํ˜• ์‹œ์Šคํ…œ์˜ ๊ฐœ์„  ์‚ฌํ•ญ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ €๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ทธ๊ฒƒ์„ํ–ˆ๋‹ค :
 ํŒŒ์ผ1 . TS
 ์ธํ„ฐํŽ˜์ด์Šค ifoo {
 a ( ) : ๋ฌดํšจ ;
 }
 ํด๋ž˜์Šค foo๋Š” ifoo {๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
 a ( ) { /*๋ฌด์–ธ๊ฐ€๋ฅผ ํ•˜์„ธ์š”*/ }
 }
 ํŒŒ์ผ2 . TS
 /// <์ฐธ์กฐ ๊ฒฝ๋กœ="file1.ts" /> //ํ•„์š”ํ•˜์ง€ ์•Š์Œ
 ์ธํ„ฐํŽ˜์ด์Šค ifoo {
 b ( ) : ๋ฌดํšจ ;
 }
 ํ‘ธ . ํ”„๋กœํ† ํƒ€์ž… . b = ( ) = > { /*๋ฌด์–ธ๊ฐ€๋ฅผ ์ˆ˜ํ–‰*/ }
 ํŒŒ์ผ3 . TS
 /// <์ฐธ์กฐ ๊ฒฝ๋กœ="file1.ts" /> //ํ•„์š”ํ•˜์ง€ ์•Š์Œ
 ์ธํ„ฐํŽ˜์ด์Šค ifoo {
 c ( ) : ๋ฌดํšจ ;
 }
 ( < ifoo > foo . ํ”„๋กœํ† ํƒ€์ž… ) . c = ( ) = > { /*๋ฌด์–ธ๊ฐ€๋ฅผ ์ˆ˜ํ–‰*/ }
 ์†Œ๋น„์ž . TS
 /// <์ฐธ์กฐ ๊ฒฝ๋กœ="file1.ts" />
 /// <์ฐธ์กฐ ๊ฒฝ๋กœ="file2.ts" />
 /// <์ฐธ์กฐ ๊ฒฝ๋กœ="file3.ts" />
 f = ์ƒˆ๋กœ์šด foo ( ) ;
 ์—ํ”„ . ( ) ;
 ์—ํ”„ . ๋‚˜ ( ) ;
 ์—ํ”„ . c ( ) ;

Module Augmentation์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์—ฌ๊ธฐ์„œ ๋ฌธ์ œ์˜ 90%๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. @svallory ์˜ ์˜ˆ๊ฐ€ ์ฃผ์–ด

/MyClass.partial.ts

export partial class MyClass {
    firstName = "John";
    lastName = "Smith";
}

MyClass.ts

// v- this would NOT throw an error because the definition is marked as partial
import { MyClass } from "./MyClass.partial";

export class MyClass {
    get fullName(): string {
        return this.firstName + ' ' + this.lastName;
    }
}

๋ชจ๋“ˆ ๋ณด๊ฐ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค ...

MyClass.ts

export class MyClass {
    firstName = 'John';
    lastName = 'Smith';
}

MyClass.generated.ts

import { MyClass } from './test';

Object.defineProperty(MyClass.prototype, "fullName", {
    get(this:MyClass) {
        return this.firstName + ' ' + this.lastName;
    }
});

declare module './test' {
    interface MyClass {
        readonly fullName: string;
    }
}

๋ถ€๋ถ„ ํด๋ž˜์Šค๋ณด๋‹ค ์กฐ๊ธˆ ๋” ์žฅํ™ฉํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ๋ถ€๋ถ„ ํด๋ž˜์Šค๋Š” ์ด ๊ตฌํ˜„์„ ์œ„ํ•œ ๊ตฌ๋ฌธ ์„คํƒ•์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

์˜ค๋Š˜๋‚  ๋‹น์‹ ์ด ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์€ ์œ ์ผํ•œ ๋ฌธ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • this: MyClass ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ์ธ ๋˜๋Š” ๋ณดํ˜ธ ํ•„๋“œ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

    • ์ด๊ฒƒ์€ any ๋กœ ์บ์ŠคํŒ…ํ•˜์—ฌ ์ƒ์„ฑ๋œ ์ฝ”๋“œ์—์„œ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ์•„๋งˆ๋„ ์ด๊ฒƒ์€ this ์˜ ๋ณดํ˜ธ๋œ ๊ตฌ์„ฑ์›์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋„๋ก ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ์™€ ๊ด€๋ จ๋œ ๋‹ค๋ฅธ ๊ทœ์น™์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ƒ์„ฑ๋œ ์ฝ”๋“œ๋Š” ์กฐ๊ธˆ ๋” ์œ„ํ˜‘์ ์œผ๋กœ ๋ณด์ด์ง€๋งŒ ์†Œ๋น„์ž์˜ ๊ฒฝ์šฐ ์ผ๋‹จ ๊ธฐ๋Šฅ์ด ๊ฐ•ํ™”๋˜๋ฉด ๊ทธ ์ฐจ์ด๋ฅผ ๊ฒฐ์ฝ” ์•Œ์ง€ ๋ชปํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํŽธ์ง‘: ์ด๊ฒƒ์€ TS 2.0+ ๊ตฌ๋ฌธ์ž„์„ ๋ช…์‹ฌํ•˜์‹ญ์‹œ์˜ค.

@david-driscoll ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋” ๊ฐ„๋‹จํ•˜๊ณ  ์ถ”๊ฐ€ ๊ตฌ๋ฌธ์„ ๋„์ž…ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์•„์‹œ๋‹ค์‹œํ”ผ ์ €๋Š” ๋ถ€๋ถ„ ํด๋ž˜์Šค๋ฅผ ํŠน์ • ์–ธ์–ด ๊ธฐ๋Šฅ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ฐ˜๋Œ€ํ•˜์ง€๋งŒ TypeScript๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ํ”„๋กœํ† ํƒ€์ž…์— ๋Œ€ํ•œ ํ• ๋‹น์„ ์ถ”์ ํ•˜๊ณ  ๊ทธ์— ๋”ฐ๋ผ ๊ฐœ์ฒด์˜ ๋ชจ์–‘์„ ๋‹ค๋“ฌ๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ์ ‘๊ทผ ๋ฐฉ์‹์ด ์—ฌ๋Ÿฌ ํŒŒ์ผ์— ํด๋ž˜์Šค๋ฅผ ๋ถ„ํ• ํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@wongchichong ๊ท€ํ•˜์˜ ์˜ˆ์ œ๋Š” ์ „์—ญ ํด๋ž˜์Šค ์ด๋ฆ„๊ณผ /// <reference path="..."/> ํ•ฉ๋‹ˆ๋‹ค. ์ƒํ™ฉ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ํ™•์žฅ์„ฑ์ด ์ข‹์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
๋ชจ๋“ˆ๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ(์ฆ‰, ์™ธ๋ถ€ ๋ชจ๋“ˆ)๋Š” ์ˆœ์„œ ์ข…์†์ ์ด๊ณ  ์•”์‹œ์ ์ธ ์ข…์†์„ฑ์„ ์ธ์‹ํ•ด์•ผ ํ•˜๋Š” ๋กœ๋”๋ฅผ ํฌํ•จํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ๋‹ค๋ฅธ ์ง์Šน์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด @svallory ์˜ ์ œ์•ˆ์ด ๊ฐ€์น˜ ์žˆ๋Š” ์ด์œ 

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด?

@pankleks ๋ถ€๋ถ„ ํด๋ž˜์Šค๋Š” ์—ฌ์ „ํžˆ ๋‚˜์œ ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค.

๋ช…ํ™•ํžˆ ํ•˜์ž๋ฉด, ํด๋ž˜์Šค ์„ ์–ธ์ด ์„ ์–ธ์ ์ด ์•„๋‹Œ ํ•„์ˆ˜์ธ JavaScript์™€ ๊ฐ™์€ ์–ธ์–ด์—์„œ๋Š” ๋‚˜์œ ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค. ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ์ฝ”๋“œ๋ฅผ ์—ฌ๋Ÿฌ ํŒŒ์ผ๋กœ ๋ถ„ํ• ํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ ์ด ํŒŒ์ผ์ด ์ „ํ˜€ ์ž‘๋™ํ•˜๋ ค๋ฉด ํ•ด๋‹น ํŒŒ์ผ์˜ ์Šคํฌ๋ฆฝํŠธ ํƒœ๊ทธ ์ˆœ์„œ์— ์˜์กดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

C#๊ณผ ๊ฐ™์€ ์–ธ์–ด์—์„œ ๋ถ€๋ถ„ ํด๋ž˜์Šค๋Š” ์ž˜ ์ž‘๋™ํ•˜์ง€๋งŒ ์ด๋Š” JavaScript์˜ ํด๋ž˜์Šค์™€ ๊ทผ๋ณธ์ ์œผ๋กœ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

JavaScript์—์„œ ํด๋ž˜์Šค ์„ ์–ธ์€ ์„ ์–ธ์ ์€ ๊ณ ์‚ฌํ•˜๊ณ  ํ˜ธ์ด์ŠคํŒ…๋˜์ง€๋„ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

ES6์„ ์ œ์™ธํ•˜๊ณ  "ํด๋ž˜์Šค" ๊ฐœ๋…์€ TS์—์„œ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. JS์—๋Š” _์ „ํ˜€__ ํด๋ž˜์Šค์— ๋Œ€ํ•œ ๊ฐœ๋…์ด ์—†์Šต๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ํด๋ž˜์Šค๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์€ TypeScript์˜ ๋ชซ์ž…๋‹ˆ๋‹ค.

ES6 ์ œ์™ธ,

TS ์–ธ์–ด ๊ธฐ๋Šฅ์„ ๋…ผ์˜ํ•  ๋•Œ ES6์„ ๊ธˆ์ง€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. TS ๋ชฉํ‘œ ์ค‘ ํ•˜๋‚˜๊ฐ€ ํ˜„์žฌ/๋ฏธ๋ž˜์˜ ES ์‚ฌ์–‘์„ ๋”ฐ๋ฅด๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค :/

์ฝ”๋“œ ์ƒ์„ฑ ํด๋ž˜์Šค(์˜ˆ: ์—”ํ„ฐํ‹ฐ, ์„œ๋น„์Šค ๊ณ„์ธต ํด๋ผ์ด์–ธํŠธ ๋“ฑ)๊ฐ€ ์žˆ๋Š” ๋Œ€๊ทœ๋ชจ ์‹œ์Šคํ…œ์˜ ๊ฒฝ์šฐ C# ๋””์ž์ธ์— ๋”ฐ๋ฅธ ๋ถ€๋ถ„ ํด๋ž˜์Šค๋Š” ์ƒ์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ ์ƒํƒœ ๋ฐ ๋™์ž‘์œผ๋กœ ํ™•์žฅํ•ด์•ผ ํ•  ๋•Œ ๋งค์šฐ ์šฐ์•„ํ•œ ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ~500๊ฐœ์˜ ์ฝ”๋“œ ์ƒ์„ฑ ํด๋ž˜์Šค๊ฐ€ ์žˆ๋Š” ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์—์„œ ์ด ๊ธฐ๋Šฅ์ด ๊ทธ๋ฆฌ์›Œ์ง‘๋‹ˆ๋‹ค.

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

์ด๊ฒƒ์€ esdiscuss์—์„œ ๋งŽ์ด ๋…ผ์˜๋˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ฐพ์€ ์œ ์ผํ•œ ์Šค๋ ˆ๋“œ ์—๋Š” 9๊ฐœ์˜ ๊ฒŒ์‹œ๋ฌผ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

@yahiko00 ์ œ๊ฐ€ ๊ทธ ์ปจ์…‰์— ์ ๋Œ€์ ์ธ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ๋งํ–ˆ๋“ฏ์ด C #๊ณผ ๊ฐ™์€ ์–ธ์–ด์—์„œ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

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

๋ฐ˜๋ฉด์— JavaScript๋Š” ๊ธฐ๊ปํ•ด์•ผ ์ดˆ๊ธฐ ๋‹จ๊ณ„์ธ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜์—…์€ ์ƒˆ๋กญ๊ณ , ์•„์ง ์–ธ์–ด์˜ ํ‘œํ˜„๋ ฅ์ด ๊ทธ๋‹ค์ง€ ๋›ฐ์–ด๋‚˜์ง€๋Š” ์•Š์ง€๋งŒ ์„ฑ์žฅํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ž ์‹œ ๋’ค๋กœ ๋ฌผ๋Ÿฌ๋‚˜ C#์˜ ๋˜ ๋‹ค๋ฅธ ๊ฐ•๋ ฅํ•˜๊ณ  ํ›จ์”ฌ ๋” ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์ธ ํ™•์žฅ ๋ฉ”์„œ๋“œ๋ฅผ ๊ณ ๋ คํ•œ๋‹ค๋ฉด JavaScript์— ์ถ”๊ฐ€๋˜๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ์‹ถ์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๋ฐ์—๋Š” ์•„์ง ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“ˆ๊ณผ ๊ฐ™์€ ํ›จ์”ฌ ๋” ๊ธฐ๋ณธ์ ์ธ ๊ฐœ๋…์„ ๊นจ๊ฑฐ๋‚˜ ์‹ฌํ•˜๊ฒŒ ์ œํ•œํ•˜์ง€ ์•Š๊ณ  ๋ถ€๋ถ„ ํด๋ž˜์Šค๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์ง€์ ์— ๋„๋‹ฌํ•˜๋ฉด ์ €๋Š” ๋ชจ๋‘ ์ด๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ์ฐฌ์„ฑํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฆ‰, @SaschaNaz๊ฐ€ ์ง€์ ํ–ˆ๋“ฏ์ด ECMAScript์—์„œ ์ด _does_๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ด€์‹ฌ ์žˆ๋Š” ์‚ฌ๋žŒ์€ http://esdiscuss.org ์—์„œ ์ƒˆ ์Šค๋ ˆ๋“œ๋ฅผ ์—ด๊ณ  ์—ฌ๊ธฐ์— URL์„ ๊ฒŒ์‹œํ•˜์—ฌ ํ† ๋ก ์„ ๊ณ„์†ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜„

์ถ”์‹ : ๋˜๋Š” GitHub์™€ ์œ ์‚ฌํ•œ ES Discourse์—์„œ .
PS2: ๋˜๋Š” GitHub์™€ ์œ ์‚ฌํ•˜๊ณ  ๋” ํ™œ๋™์ ์ธ WICG์—์„œ .

๋‚˜๋„ TS์šฉ ์ฝ”๋“œ ์ƒ์„ฑ์„ ํ—ˆ์šฉํ•˜๋Š” ์ผ๋ถ€ ๊ตฌ์„ฑ์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋ถ€๋ถ„ ํด๋ž˜์Šค๋Š” C#์—์„œ ์ด์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

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

๋…ผ์˜์— ๋”ฐ๋ฅด๋ฉด '์•ˆ์ „ํ•œ' TS ํ˜์‹ ์ด ๋งŽ์ด ์™„๋ฃŒ๋œ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ์ด์ œ ์šฐ๋ฆฌ๋Š” ์•ž์œผ๋กœ ์•„๋ฌด ๊ฒƒ๋„ ๊นจ๋œจ๋ฆฌ๊ณ  ์‹ถ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ES ๊ฑฐ๋ฒ„๋„Œ์Šค ๊ธฐ๊ตฌ๊ฐ€ ๋ฌด์—‡์„ ํ•˜๋Š”์ง€ ๋ณด๊ธฐ๋งŒ์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์™„์ „ํžˆ ์œ ํšจํ•˜์ง€๋งŒ TS๋กœ ๋” ๋นจ๋ฆฌ ์›€์ง์ด๋Š” ๊ธฐ์ฐจ๋ฅผ ๋ฐ”๋ž๊ธฐ ๋•Œ๋ฌธ์— ์•ฝ๊ฐ„ ๋‚™๋‹ดํ–ˆ์Šต๋‹ˆ๋‹ค.

์ „์ œ ์กฐ๊ฑด์€ ์ข‹์€ ๋””์Šˆ๊ฐ€๋ง์„ ์ฐพ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค .

์ด์ „์—๋Š” ํด๋ž˜์Šค์— ์ง์ ‘ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ถ€๋ถ„ ํด๋ž˜์Šค๊ฐ€ ๊ฝค ์–ด๋ฆฌ์„๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ, ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ฉ”์„œ๋“œ๋ฅผ ์—ด๊ฑฐํ•  ์ˆ˜ ์—†๊ฒŒ ๋งŒ๋“ค๊ณ  ์Šˆํผ ๋ฐ”์ธ๋”ฉ์„ ์ˆ˜์ •ํ•˜๋Š” ์ž‘์—…์ด ํฌํ•จ๋œ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ๋งค๋ ฅ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(ํ›„์ž๋Š” ํ˜„์žฌ ES6).

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

์ด๊ฒƒ์ด ์ •ํ™•ํžˆ ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ์•„๋งˆ๋„ ๋‹ค์Œ๊ณผ ๊ฐ™์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

class A {
  foo() { return "foo" }
}
class B extends A {
}

partial(B, class {
  get foo() {
    return super.foo(); // should work
  }
});

( esdiscuss ์— ์‹ญ์ž๊ฐ€ ๊ฒŒ์‹œ )

์ˆœ์ˆ˜ JS์—์„œ ๋ถ€๋ถ„ ํด๋ž˜์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์ƒ๋‹นํžˆ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค( ES2017 getOwnPropertyDescriptors ์‚ฌ์šฉ ). ES ์‚ฌ๋žŒ๋“ค์€ ์ด ์ž‘์€ ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ฐ ๊ตฌ๋ฌธ ์„คํƒ•์ด ํ•„์š”ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

function partial(base, extension) {
ย  extension.prototype.__proto__ = base.prototype.__proto__; // to enable 'super' reference
ย  const descriptors = Object.getOwnPropertyDescriptors(extension.prototype);
ย  delete descriptors.constructor; // must not override constructor
ย  Object.defineProperties(base.prototype, descriptors);
ย  
ย ย return base;
}

๋ฌผ๋ก  TS์—์„œ ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๊ธฐ์กด ํด๋ž˜์Šค ์œ ํ˜•์„ ํ™•์žฅํ•˜๊ธฐ ์œ„ํ•ด interface ์ค‘๋ณต์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

@SaschaNaz getOwnPropertyDescriptors๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ์ž์— ์ถ”๊ฐ€๋œ ์†์„ฑ์€ IDE "์ž๋™ ์ œ์•ˆ"์— ๋Œ€ํ•ด ์ˆจ๊ฒจ์งˆ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค(๋Ÿฐํƒ€์ž„์— ์ถ”๊ฐ€๋˜๊ธฐ ๋•Œ๋ฌธ์—). Typescript๋Š” "autosuggestion"์ด ์žˆ๋Š” JavaScript๋กœ ํƒœ์–ด๋‚ฌ์Šต๋‹ˆ๋‹ค(๋•Œ๋•Œ๋กœ ์‚ฌ๋žŒ๋“ค์€ ์ด๊ฒƒ์„ "strongly typed"๋ผ๊ณ  ๋ถ€๋ฅด์ง€๋งŒ ์‹ค์ œ๋กœ ๊ทธ๋“ค์ด ์ข‹์•„ํ•˜๋Š” ๊ฒƒ์€ "autosuggestion"์ž…๋‹ˆ๋‹ค).

์ถ”์‹  ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋ถ€๋ถ„ ํด๋ž˜์Šค๊ฐ€ ํ•„์š”ํ•œ ์ด์œ  - ์ฝ”๋“œ ์ƒ์„ฑ. ๊ทธ๋Ÿฌ๋‚˜ ๋‹ค์‹œ ์ฝ”๋“œ ์ƒ์„ฑ์€ IDE(์†Œ์Šค ํŒŒ์ผ์— ๋Œ€ํ•œ ์‰ฌ์šด "๋„๊ตฌ" ์กฐ์ •, ํŒŒ์ผ ํƒ์ƒ‰๊ธฐ์˜ ๊ณ„์ธต์  ๊ฒฐ๊ณผ, T4 ๋˜๋Š” ์œ ์‚ฌํ•œ "๊ณตํ†ต ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ" ์ง€์›) ๋ฐ ์–ธ์–ด(๋ถ€๋ถ„ ํด๋ž˜์Šค, ํ™•์žฅ ๋ฉ”์„œ๋“œ) ๋ชจ๋‘์—์„œ ์ง€์›๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ์ดํ•ดํ•œ ํ›„์—์•ผ ๊ฐœ๋ฐœ์ž๊ฐ€ ์‹ค์ œ๋กœ ๋ฌด์—‡์„ ์š”๊ตฌํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ „์ฒด ๊ทธ๋ฆผ์„ ๋ณผ ์ˆ˜ ์—†๋‹ค๋ฉด ๋ฌผ๋ก  "๋ถ€๋ถ„ ์ˆ˜์—…"์€ "๋„Œ์„ผ์Šค"์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

@aluanhaddad : ํ•˜์ง€๋งŒ TypeScript์˜ ์ฃผ์š” ๊ธฐ๋Šฅ์€ JavaScript์— ์—†๋Š” ์–ธ์–ด ์š”์†Œ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ ์•„๋‹™๋‹ˆ๊นŒ? ํด๋ž˜์Šค๋ฅผ ๋‘ ๊ฐœ์˜ ๋ถ€๋ถ„ TypeScript ํŒŒ์ผ๋กœ ๋ถ„ํ• ํ•˜์—ฌ ๋‹จ์ผ JavaScript ํŒŒ์ผ๋กœ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒƒ์ด ์™œ ๋‚˜์œ ์ƒ๊ฐ์ž…๋‹ˆ๊นŒ?

์ปค๋ฎค๋‹ˆํ‹ฐ์— ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์„ ์˜ค์šฉํ•  ๊ฐœ๋ฐœ์ž๊ฐ€ ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  100% ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •ํ™•ํžˆ ์•Œ๊ณ  ์žˆ๋Š” ๊ฐœ๋ฐœ์ž๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ์–ด๋–ค ์–ธ์–ด์˜ ์–ด๋–ค ๊ตฌ์„ฑ์—์„œ๋„ ๊ฐ™์€ ์ƒํ™ฉ์— ์ฒ˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

์ฝ”๋“œ ์ƒ์„ฑ ๋ชฉ์ ์œผ๋กœ +1. ๊ทธ๋ฆฌ๊ณ  ์ €๋Š” @rpokrovskij ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์™œ

@greendimka ES ๋ชจ๋“ˆ์—์„œ ๋ฒ—์–ด๋‚˜ ์ƒ๋‹นํ•œ ๋ณต์žก์„ฑ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ณ  ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

@xiexin36 TypeScript๋Š” ํ™•์‹คํžˆ C#๋ณด๋‹ค JavaScript์— ๋” ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.
JavaScript์™€ C# ์‚ฌ์ด์—๋Š” ๊ณตํ†ต์ ์ด ์žˆ์ง€๋งŒ class ์˜ ๊ฐœ๋…์€ ์™„์ „ํžˆ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

์ฝ”๋“œ ์ƒ์„ฑ์„ ์œ„ํ•ด @xiexin36 ์„ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ์ „ํžˆ ๋ชจ๋“ˆ ํ™•์žฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค( ์ด ์Šค๋ ˆ๋“œ์˜ ์•ž๋ถ€๋ถ„์—์„œ ์–ธ๊ธ‰

@aluanhaddad ๊ธ€์Ž„, ๊ทธ๊ฒƒ์€ ๋งค์šฐ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋ถ€๋ถ„ ํด๋ž˜์Šค๋Š” ์–ด๋–ค ์‹์œผ๋กœ๋“  ์ฝ”๋“œ ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์€ ์šฐ๋ฆฌ๊ฐ€ (์–ด์จŒ๋“  ๋‹จ์ผ JS๋กœ ์ปดํŒŒ์ผ๋œ) ์—ฌ๋Ÿฌ ํŒŒ์ผ์— ๋™์ผํ•œ ํด๋ž˜์Šค์˜ ์ •์˜๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

@aluanhaddad ์—„๋ฐ€ํžˆ ๋งํ•˜๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—๋Š” ํด๋ž˜์Šค ๊ฐœ๋…์ด ์—†์Šต๋‹ˆ๋‹ค(ES6 ํด๋ž˜์Šค๋Š” ๋‹จ์ง€ ํ•ฉ์„ฑ ์„คํƒ•์„ ์ œ๊ณตํ•จ). ๋”ฐ๋ผ์„œ TypeScript๊ฐ€ JavaScript๋งŒํผ ์ทจ์•ฝํ•˜๋‹ค๋Š” ๊ฐœ๋…์„ ๋”ฐ๋ฅด๋ ค๊ณ  ํ•˜๋ฉด TypeScript์—์„œ ํด๋ž˜์Šค๋ฅผ ๋ฒ„๋ ค์•ผ ํ•˜์ง€ ์•Š์„๊นŒ์š”? ์šฐ๋ฆฌ๋Š” ๋‹จ์ˆœํžˆ JavaScript๋กœ ๋˜๋Œ๋ ค์•ผ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

@greendimka ES6 ํด๋ž˜์Šค์™€ TypeScript ํด๋ž˜์Šค๋Š” ํ•˜๋‚˜์ด๋ฉฐ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.
TypeScript๋Š” JavaScript์˜ ๋Ÿฐํƒ€์ž„์— ์ถ”๊ฐ€ ๊ตฌ์„ฑ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ES6 ํด๋ž˜์Šค๋Š” _๋งค์šฐ_ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๊ณ  JavaScript๊ฐ€ ๊ฐ•๋ ฅํ•œ ์–ธ์–ด๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. TypeScript๋Š” ์ •์  ํƒ€์ดํ•‘์„ ์ œ๊ณตํ•˜์—ฌ ์„ค๊ณ„ ์‹œ ์˜ค๋ฅ˜๋ฅผ ํฌ์ฐฉํ•˜๊ณ  ๊ณ ํ’ˆ์งˆ ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ ๊ตฌ์„ฑ ์š”์†Œ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋งค์šฐ ์ •ํ™•ํ•˜๊ณ  ์—„๊ฒฉํ•œ ์‚ฌ์–‘์„ ํ—ˆ์šฉํ•˜๊ณ  ์ผ๋ฐ˜์ ์œผ๋กœ ์ƒ์‚ฐ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

ES6 ํด๋ž˜์Šค๋Š” _๋งค์šฐ_ ๋ถ€์กฑํ•˜์ง€๋งŒ TypeScript๊ฐ€ ์ž์ฒด ํด๋ž˜์Šค ๊ฐœ๋…์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์€ ์„ค๊ณ„ ๋ชฉํ‘œ๋ฅผ ์ง์ ‘์ ์œผ๋กœ ์œ„๋ฐ˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹จ์ˆœํžˆ ์ˆ˜์—…์„ ํ”ผํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

๊ธ€์Ž„, ๊ทธ๊ฒƒ์€ ๋งค์šฐ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋ถ€๋ถ„ ํด๋ž˜์Šค๋Š” ์–ด๋–ค ์‹์œผ๋กœ๋“  ์ฝ”๋“œ ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์€ ์šฐ๋ฆฌ๊ฐ€ (์–ด์จŒ๋“  ๋‹จ์ผ JS๋กœ ์ปดํŒŒ์ผ๋œ) ์—ฌ๋Ÿฌ ํŒŒ์ผ์— ๋™์ผํ•œ ํด๋ž˜์Šค์˜ ์ •์˜๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ธ๊ฐ„์—๊ฒŒ ์•Œ๋ ค์ง„ ๊ฑฐ์˜ ๋ชจ๋“  ๋„๊ตฌ๋ฅผ ๋ถ€์ˆ˜๋‚˜์š”? ์•„๋‹ˆ์š” ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

@david-driscoll ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์‹œ๋„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Angular 2.0๋„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
@Input ๋˜๋Š” @Output , ์ž‘๋™ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ์‹œ๋„ํ•ด ๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@aluanhaddad "ํด๋ž˜์Šค? javascript์—๋Š” ํด๋ž˜์Šค๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค"๋ฅผ ๋ฐ˜๋ณตํ•˜๋Š” ๋ฐ ์–ด๋–ป๊ฒŒ ๋งค๋‹ฌ ์Šค๋Ÿฌ์šด ์ผ์ž…๋‹ˆ๋‹ค. ๋จธ๋ฆฌ์—์„œ ํด๋ž˜์Šค๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  JavaScript๋งŒ ๋‚จ๊ฒจ๋‘๊ณ  ์ด์ œ ๋“ค์–ด๋ณด์‹ญ์‹œ์˜ค. ์ฝ”๋“œ ์ƒ์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋Š” ์—ฌ๋Ÿฌ ํŒŒ์ผ์— ํ•˜๋‚˜์˜ ์ปดํŒŒ์ผ ๋‹จ์œ„๋ฅผ ๊ฐ–๊ณ  ์‹ถ์–ดํ•ฉ๋‹ˆ๋‹ค. ์ด ์–ธ์–ด์—๋Š” ํด๋ž˜์Šค๊ฐ€ ์—†๊ณ  ํ•จ์ˆ˜๋งŒ ์žˆ์Šต๋‹ˆ๊นŒ? ์ข‹์•„, ์šฐ๋ฆฌ๋Š” ๋ถ€๋ถ„์ ์ธ ๊ธฐ๋Šฅ์„ ์›ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  JavaScript๋Š” ์ด์— ๋Œ€ํ•œ ์ค€๋น„๊ฐ€ ๊ฑฐ์˜ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์„ ์–ธ ์ „์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๊ฑฐ๊ธฐ์—์„œ ๋‹ค๋ฅธ ๋ฌธ์ œ๋ฅผ ๋งŒ๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: ๋ชจ๋“  ๋ถ€๋ถ„/ํŒŒ์ผ์ด ์‹คํ–‰ ํ™˜๊ฒฝ์— ๋กœ๋“œ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ). ๊ทธ๋Ÿฌ๋‚˜ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์‹ค์ œ๋กœ JavaScrpipt๊ฐ€ ์•„๋‹Œ TypeScript์—์„œ ๋ถ€๋ถ„ ์ปดํŒŒ์ผ ๋‹จ์œ„๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. Typescript๋Š” ์ด๋ฅผ 100% ์ค€๋น„ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ TypeScript ํŒ€์—์„œ ์ผ๋ถ€ ๊ธฐ๋Šฅ๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค! ๊ทธ๋ฆฌ๊ณ  ์ง€๊ธˆ์€ "ํ•จ์ˆ˜์— ํ•จ์ˆ˜"๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ C# ํŒ€์—๋„ ๋˜‘๊ฐ™์ด ์•Œ๋ ค์ฃผ์„ธ์š”. :)

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

@์•Œ๋ฃจ์•ˆํ•˜๋‹ค๋“œ . "์—ฌ๋Ÿฌ ํŒŒ์ผ์˜ ํ•˜๋‚˜์˜ ์ปดํŒŒ์ผ ๋‹จ์œ„"๋ผ๋Š” ์šฉ์–ด๋ฅผ ์ดํ•ดํ•ฉ๋‹ˆ๊นŒ? Javascript๋Š” ๋ฌผ๋ก  ์ปดํŒŒ์ผ ์–ธ์–ด๊ฐ€ ์•„๋‹ˆ์ง€๋งŒ a) ํ•จ์ˆ˜๋Š” ์‹คํ–‰ ์ „์— ์™„์ „ํžˆ ๊ตฌ๋ฌธ ๋ถ„์„๋˜์–ด์•ผ ํ•˜๋ฉฐ ์ด ์ด๋ฆ„์„ "์ปดํŒŒ์ผ"์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. b) Typescript๋Š” ์ปดํŒŒ์ผ ์–ธ์–ด์ž…๋‹ˆ๋‹ค.

๋‹น์‹ ์˜ ์ƒ์ƒ๋ ฅ์„ ๋•๊ธฐ ์œ„ํ•ด:

function partial func(arguments) {
  return function() {
    return codegenerated(arguments);
  };
}

function partial func(arguments) {
   function codegenerated(arguments){
      // ...
   }
}

๋˜ํ•œ ๋ถ€๋ถ„ ํด๋ž˜์Šค๋ฅผ ์ž์ฃผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ฝ”๋“œ ์ƒ์„ฑ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ "์ˆ˜๋™" ๋ถ€๋ถ„์— ์ €์žฅํ•ด์•ผ ํ•˜๊ณ  ์ด ๊ตฌ์„ฑ์„ ์ฝ์œผ๋ ค๋ฉด ์ข‹์€ ์–ธ์–ด ํŒŒ์„œ(๋ฐ˜์‚ฌ ์•„๋‹˜)๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ถ€๋ถ„ ํด๋ž˜์Šค๋Š” ์ฝ”๋“œ ์ƒ์„ฑ์„ ํŽธ์•ˆํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๋งŽ์€ ๋„๊ตฌ ์ค‘ ํ•˜๋‚˜์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

@rpokrovskij
์ œ๊ฐ€ ์ ๋Œ€๊ฐ์œผ๋กœ ๋‚˜์™”๋‹ค๋ฉด ์‚ฌ๊ณผ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ชจ์š•์ด๋‚˜ ๋ฌด๋ก€๋ฅผ ์˜๋ฏธํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ์˜ˆ์—๋Š” ๊ทธ ์ž์ฒด๋กœ ์ƒ๋‹นํžˆ ๊ณต์‹์ ์ธ ์„ค๋ช…์ด ํ•„์š”ํ•œ ์ธก๋ฉด์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ œ์•ˆ์€ ์›๋ž˜ ์ฝ”๋“œ ์ƒ์„ฑ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ง์ ‘ ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

@aluanhaddad....
"์ˆ˜์—…์„ ํ”ผํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค." - ์ง„์ง€ํ•˜๊ฒŒ, ๊ทธ๊ฒƒ์ด ๋ฌธ์ œ์˜ ํ•ด๊ฒฐ์ฑ…?! ์•„๋งˆ๋„ JavaScript ์‚ฌ์šฉ์„ ํ”ผํ•œ๋‹ค๋ฉด ์ด ์ „์ฒด ํ† ๋ก ์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ญ์‹œ ํ•ด๊ฒฐ์ฑ…์ด๊ฒ ์ฃ ? ๋ถˆํ–‰ํžˆ๋„ ์šฐ๋ฆฌ ์šฐ์ฃผ์—๋Š” ์ด ์—‰ํ„ฐ๋ฆฌ ์–ธ์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋ช‡ ๋…„ ์ „์— ์›น์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์„ ๋งŒํผ ์šด์ด ์ข‹์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ์ด๊ฒƒ์€ ์ฃผ์ œ๋ฅผ ๋ฒ—์–ด๋‚œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

"์‚ฌ๋žŒ์—๊ฒŒ ์•Œ๋ ค์ง„ ๊ฑฐ์˜ ๋ชจ๋“  ๋„๊ตฌ๋ฅผ ๋ถ€์ˆ˜๋‹ค" - ๊ทธ๊ฒŒ ์–ด๋–ป๊ฒŒ ๊ฐ€๋Šฅํ•œ๊ฐ€์š”??? ์–ด๋–ป๊ฒŒ?!?! TypeScript์—์„œ ๋ถ€๋ถ„ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌด์–ธ๊ฐ€๋ฅผ ๊นจ๋Š” ๊ฒƒ์„ ์ƒ์ƒํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹จ์ˆœํžˆ ํ•  ์ˆ˜ ์—†๋‹ค. ์‹ค์ƒํ™œ์˜ ์˜ˆ๋ฅผ ๋“ค์–ด ์—ฌ๊ธฐ์—์„œ ์ €๋ฅผ ๋„์™€์ฃผ์„ธ์š”.

์ด์ œ ์ƒ์ž๋ฅผ ์šด๋ฐ˜ํ•˜๊ธฐ ์œ„ํ•ด ์ž๋™์ฐจ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ณด์‹ญ์‹œ์˜ค. ๋ฌธ์ œ ์—†์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ์ฐจ์— ์ง์„ ์‹ฃ๋Š” ์ง์›์„ ๊ณ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ž‘์—…์ž๋Š” ํ•œ ๋ฒˆ์— ๋‘ ๊ฐœ์˜ ์ƒ์ž๋ฅผ ๊ฐ€์ ธ์™€ ์ฐจ์— ์‹ฃ์Šต๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ๋ชจ๋“  ๊ฒƒ์ด ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
์–ด๋Š ๋‚  ์ง์›์ด ๋‹ค๋ฅธ ํšŒ์‚ฌ๋กœ ๋– ๋‚˜๊ณ  ๋‹น์‹ ์€ ์ƒˆ ํšŒ์‚ฌ๋ฅผ ๊ณ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ์ œํ’ˆ์€ ๋‹จ์ผ ์ƒ์ž๋ฅผ ๊ฐ€์ ธ์™€์„œ ๋กœ๋“œํ•˜๊ณ  ๋‹ค๋ฅธ ๋‹จ์ผ ์ƒ์ž๋ฅผ ๊ฐ€์ ธ์™€์„œ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ๋…ผ๋ฆฌ์ ์œผ๋กœ: ๋ชจ๋“  ๊ฒƒ์ด ์ •์ƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‹น์‹ ์€ ๋›ฐ์–ด๋‹ค๋‹ˆ๋ฉฐ ์†Œ๋ฆฌ๋ฅผ ์งˆ๋ €์Šต๋‹ˆ๋‹ค. ๊ทธ๋งŒ, ๊ทธ๋งŒ, ์‹œ์Šคํ…œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค! :)

"์ˆ˜์—…์„ ํ”ผํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค." - ์ง„์ง€ํ•˜๊ฒŒ, ๊ทธ๊ฒƒ์ด ๋ฌธ์ œ์˜ ํ•ด๊ฒฐ์ฑ…?! ์•„๋งˆ๋„ JavaScript ์‚ฌ์šฉ์„ ํ”ผํ•œ๋‹ค๋ฉด ์ด ์ „์ฒด ํ† ๋ก ์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ญ์‹œ ํ•ด๊ฒฐ์ฑ…์ด๊ฒ ์ฃ ? ๋ถˆํ–‰ํžˆ๋„ ์šฐ๋ฆฌ ์šฐ์ฃผ์—๋Š” ์ด ์—‰ํ„ฐ๋ฆฌ ์–ธ์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋ช‡ ๋…„ ์ „์— ์›น์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์„ ๋งŒํผ ์šด์ด ์ข‹์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ์ด๊ฒƒ์€ ์ฃผ์ œ๋ฅผ ๋ฒ—์–ด๋‚œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ES2015๋Š” ํ™•์‹คํžˆ ์ž˜๋ชป๋œ ์ ์ด ๋งŽ์Šต๋‹ˆ๋‹ค. ES5.1์€ ํ™•์‹คํžˆ ์ž˜๋ชป๋œ ์ ์ด ๋งŽ์•˜์Šต๋‹ˆ๋‹ค. ์ œ ์ƒ๊ฐ์—๋Š” ์ˆ˜์—…์ด ๋ถ€์กฑํ•œ ๊ฒƒ๋„ ๊ทธ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์•„๋‹ˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์š”์ ์€ ๊ณต๊ฐœ ๋ชจ๋“ˆ ํŒจํ„ด๊ณผ ๊ฐ™์€ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ถ€๋ถ„ ํด๋ž˜์Šค๊ฐ€ ํ•„์š” ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. TypeScript๋Š” ํ‘œ์‹œ ๋ชจ๋“ˆ ํŒจํ„ด, ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ๋Œ€ํ•œ ์„คํƒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

"์‚ฌ๋žŒ์—๊ฒŒ ์•Œ๋ ค์ง„ ๊ฑฐ์˜ ๋ชจ๋“  ๋„๊ตฌ๋ฅผ ๋ถ€์ˆ˜๋‹ค" - ๊ทธ๊ฒŒ ์–ด๋–ป๊ฒŒ ๊ฐ€๋Šฅํ•œ๊ฐ€์š”??? ์–ด๋–ป๊ฒŒ?!?! TypeScript์—์„œ ๋ถ€๋ถ„ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌด์–ธ๊ฐ€๋ฅผ ๊นจ๋Š” ๊ฒƒ์„ ์ƒ์ƒํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹จ์ˆœํžˆ ํ•  ์ˆ˜ ์—†๋‹ค. ์‹ค์ƒํ™œ์˜ ์˜ˆ๋ฅผ ๋“ค์–ด ์—ฌ๊ธฐ์—์„œ ์ €๋ฅผ ๋„์™€์ฃผ์„ธ์š”.

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

๋”ฐ๋ผ์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์–ธ์–ด์˜ ์ง„ํ™”๋Š” ์–ธ์–ด์˜ ์ง„ํ™” ์—†์ด๋Š” ๊ฒฐ์ฝ” ์ง„ํ™”ํ•˜์ง€ ์•Š์„ ๋„๊ตฌ์— ์˜ํ•ด ์ €์ง€๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๋ฏธ์•ˆํ•˜์ง€๋งŒ ์ง„ํ™”ํ•˜์ง€ ์•Š๋Š” ์ด์œ ์— ๋Œ€ํ•œ ๊ฒ€์ƒ‰๋งŒ ์—ฌ๊ธฐ์—์„œ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถ€๋ถ„ ํด๋ž˜์Šค๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ด์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ๋Š” ์–ธ์–ด๋กœ ์ด๋ฏธ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ข‹์€ ๊ตฌ๋ฌธ ์„คํƒ•์ด์ง€๋งŒ ์ง„์ •ํ•œ ์ด์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? C#์ฒ˜๋Ÿผ ๋งŒ๋“œ๋Š” ๊ฒƒ ์™ธ์— ๊ตฌ์ฒด์ ์ธ ์˜ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?


์ฐธ๊ณ ๋กœ ์ €๋Š” C# ๊ฐœ๋ฐœ์ž๋กœ ์‹œ์ž‘ํ•œ ๊ธฐ๋ก์„ ์œ„ํ•ด ๊ทธ๊ณณ์—์„œ JavaScript/C#์œผ๋กœ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค. TypeScript 0.8์ด ๋ฐœํ‘œ๋œ ํ›„ ์ œ๊ฐ€ ํŒ๋งค๋œ ์ด์œ ๋Š” JavaScript์šฉ C#์ด๊ธฐ ๋•Œ๋ฌธ์ด ์•„๋‹ˆ๋ผ ์—„๊ฒฉํ•œ JavaScript๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ฐ•๋ ฅํ•œ C# ์œ ํ˜•์„ ์ฆ๊ธฐ๋Š” ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋” ์ ํ•ฉํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

TypeScript๋Š” C#์ด ์•„๋‹ˆ๋ฉฐ C#์— ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค๋Š” ์ด์œ ๋งŒ์œผ๋กœ C#์—์„œ ๊ธฐ๋Šฅ์„ ์—„๊ฒฉํ•˜๊ฒŒ ์ƒ์†ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. C#์ด TypeScript์—์„œ ๊ธฐ๋Šฅ์„ ์ƒ์†ํ•ด์„œ๋Š” ์•ˆ ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ. TypeScript์—์„œ๋Š” ๋งค์šฐ ํ›Œ๋ฅญํ•˜์ง€๋งŒ ์•„์ง ์–ธ์–ด์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— C#์—์„œ ๊ณต์šฉ์ฒด ์œ ํ˜•๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์›ํ–ˆ๋˜ ์‹œ๊ฐ„์„ ์…€ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.


์ง€๊ธˆ๊นŒ์ง€ ์ฝ”๋“œ ์ƒ์„ฑ ๋ฐ ์ฝ”๋“œ ๊ตฌ์„ฑ์„ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค.

Code Generation, Module Augmentation์„ ๋ณด์„ธ์š”. ์—ฌ๊ธฐ์— ์ œ๊ฐ€ ์–ธ๊ธ‰ํ•œ ๋ช‡ ๊ฐ€์ง€ ๊ฒฐํ•จ์ด ์žˆ์ง€๋งŒ ๊ณ ์น  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ ์กฐ์ง, ์ง€์—ญ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ๊ฐ™์•„์š” (์›ƒ์Œ)? ์ฝ”๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋‹ค๋ฅธ ๋งŽ์€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ God ํด๋ž˜์Šค๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ(์–ด๋–ค ์ด์œ ๋กœ๋“ ) ํ•ญ์ƒ ์—ฌ๋Ÿฌ God ํด๋ž˜์Šค๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ‘œ๋ฉด์ ์œผ๋กœ god ํด๋ž˜์Šค๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์ด ๋ณด๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ์ด์ง€๋งŒ, ๊ฒ‰์œผ๋กœ๋Š” God ํด๋ž˜์Šค์˜ ์†์„ฑ์œผ๋กœ ๋งŽ์€ ํด๋ž˜์Šค๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์กฐ์ง์„ ์œ„ํ•ด ๋ถ€๋ถ„ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ฝ”๋“œ๋ฅผ ์•ฝ๊ฐ„ ๋ฆฌํŒฉํ† ๋งํ•˜๊ณ  SOLID ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ง€๊ธˆ๊นŒ์ง€ ๋งŒ๋‚œ ๋Œ€๋ถ€๋ถ„์˜ ์ฝ”๋“œ ์ƒ์„ฑ ์‹œ๋‚˜๋ฆฌ์˜ค์— ๊ธฐ๋Šฅ ๋ณด๊ฐ•์„ ๋งž์ถœ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

Omnisharp-Client์˜ ๊ฒฝ์šฐ ์—ฌ๊ธฐ ์—์„œ ์ธํ„ฐํŽ˜์ด์Šค ํ™•์žฅ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ OmniSharp.Api.V2 ๋Š” C#์˜ ๋ฆฌํ”Œ๋ ‰์…˜์„ ํ†ตํ•ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ ๋งจ ์•„๋ž˜์—๋Š” ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋ฅผ ์Šคํ… ์•„์›ƒํ•˜๋Š” ๋„๊ตฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

RxJS์˜ ๊ฒฝ์šฐ Observable ์— ์žˆ๋Š” ๋ชจ๋“  ๋ฉ”์„œ๋“œ ๋ฅผ

๋ถ€๋ถ„ ํด๋ž˜์Šค์˜ ์ผ๋ถ€ ๋ฌธ์ œ์— ๋Œ€ํ•ด์„œ๋Š” ์ถ”๋ก ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 3๊ฐœ์˜ ๋ถ€๋ถ„ ํด๋ž˜์Šค๊ฐ€ ์ œ๊ณต๋˜๋Š” ๊ฒฝ์šฐ.

  • MyAwesomeClass1.ts
  • MyAwesomeClass2.ts
  • MyAwesomeClass3.ts

๋ฒ”์œ„: ๊ธ€๋กœ๋ฒŒ ๋ชจ๋“ˆ( namespace / module )

์ „์—ญ ์ปดํŒŒ์ผ์€ ์ด๊ฒƒ์ด ๊ฐ€์žฅ ์‰ฌ์šด ๊ฒƒ์œผ๋กœ ๋ณด์ด๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค. TypeScript๋Š” ์ด๋ฏธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๋ณ‘ํ•ฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋‚ด tsconfig.json ์— Class1 ๋ฐ Class2์— ๋Œ€ํ•œ ํŒŒ์ผ ๊ฒฝ๋กœ๋งŒ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด Class3์— ์žˆ๋Š” ๋ชจ๋“  ํ•ญ๋ชฉ์ด ์ž๋™์œผ๋กœ ๋ณ‘ํ•ฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

๋ฒ”์œ„: ์™ธ๋ถ€ ๋ชจ๋“ˆ(๊ฐ€์ ธ์˜ค๊ธฐ/๋‚ด๋ณด๋‚ด๊ธฐ)

์™ธ๋ถ€ ์ปดํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ ๋ชจ๋“ˆ์—๋Š” ๋ชจ๋“  ์ข…์†์„ฑ(๊ฐ€์ ธ์˜ค๊ธฐ)๊ณผ ๋ชจ๋“  ๊ณต๊ฐœ API(๋‚ด๋ณด๋‚ด๊ธฐ)์— ๋Œ€ํ•œ ๋ช…์‹œ์  ๋ชฉ๋ก์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ ํŒŒ์ผ์€ ์‹ค์ œ๋กœ ๋ชจ๋“ˆ(๋˜๋Š” .NET ์„ธ๊ณ„์—์„œ๋Š” ์ง€์˜ฅ ์–ด์…ˆ๋ธ”๋ฆฌ)์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ถ”๋ก ํ•ฉ๋‹ˆ๊นŒ?

ํŒŒ์ผ ์ฐธ์กฐ๊ฐ€ ํ•˜๋‚˜๋งŒ ์ฃผ์–ด์ง€๋ฉด ํด๋ž˜์Šค์˜ ๋™์ž‘์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
Class2์™€ Class3์„ ์ž๋™์œผ๋กœ ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๊นŒ?

  • Class1, Class2 ๋ฐ Class3์˜ ๊ธฐ๋ณธ ์ •์˜๊ฐ€ ๋ชจ๋‘ ์ •ํ™•ํžˆ ๋™์ผํ•œ ๊ฐ’์„ ๋‚ด๋ณด๋‚ด๋‚˜์š”?
  • ์–ด๋–ค ํŒŒ์ผ์ด ๋””์Šคํฌ๋กœ ๋‚ด๋ณด๋‚ด์ง‘๋‹ˆ๊นŒ?
  • ์ง€์›๋˜๋Š” ๋ชจ๋“  ํ˜•์‹(amd, umd, commonjs ๋“ฑ)์— ๋Œ€ํ•œ ๊ธฐ๋ณธ JavaScript๋Š” ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ์Šต๋‹ˆ๊นŒ?
// somefile.ts
import { MyAwesomeClass } from 'MyAwesomeClass1';

new mac = new MyAwesomeClass();
mac. // What methods are available here?

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

// somefile.ts
import { MyAwesomeClass } from 'MyAwesomeClass1';
import { MyAwesomeClass } from 'MyAwesomeClass2'; // or maybe import 'MyAwesomeClass2';
import { MyAwesomeClass } from 'MyAwesomeClass3'; // or maybe import 'MyAwesomeClass3';

new mac = new MyAwesomeClass();
mac. // What methods are available here?

@david-driscoll ์—ฌ๊ธฐ ๋‚ด 2์„ผํŠธ๋งŒ:

๋ฌผ๋ก  ์ข‹์€ ๊ตฌ๋ฌธ ์„คํƒ•์ด์ง€๋งŒ ์ง„์ •ํ•œ ์ด์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ข‹์€ ๊ตฌ๋ฌธ ์„คํƒ•์€ ๋ชจ๋“  ์–ธ์–ด์˜ ์š”์ ์ด ์•„๋‹™๋‹ˆ๊นŒ? ์ž‘๋™์ ์ธ ๊ด€์ ์—์„œ ์šฐ๋ฆฌ์—๊ฒŒ ํ•„์š”ํ•œ ๊ฒƒ์€ ๋ฃจํ”„, if-์ ˆ ๋ฐ ๋ชจ๋“  ๊ฒƒ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ˜๋ณต๋ฟ์ž…๋‹ˆ๋‹ค. ๋‚˜๋จธ์ง€๋Š” ์ƒ์‚ฐ์„ฑ์„ ๋†’์ด๊ณ  ๋‹ค๋ฅธ ์œ ์‚ฌํ•œ ๋น„๊ธฐ๋Šฅ์  ํŠน์„ฑ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•œ _์ข‹์€ ๊ตฌ๋ฌธ ์„คํƒ•์ž…๋‹ˆ๋‹ค.

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

TypeScript์— ๋Œ€ํ•ด ์ข‹์•„ํ•˜๋Š” ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. 1. ์œ ํ˜•์ด ์ง€์ •๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ณต์žกํ•œ ์‹œ์Šคํ…œ์„ ๊ฐ‘์ž๊ธฐ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. 2. ์œ ํ˜• ์‹œ์Šคํ…œ์€ ๋งค์šฐ ํ‘œํ˜„๋ ฅ์ด ๋›ฐ์–ด๋‚ฉ๋‹ˆ๋‹ค(์œ ํ˜• ์‹œ์Šคํ…œ์˜ ์ œํ•œ ์—†์ด ์‚ฌ๋žŒ๋“ค์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์ข…๋ฅ˜์˜ ํŒจํ„ด์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐ•์š”๋ฐ›์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค).

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

Partial ํด๋ž˜์Šค๋Š” ํŠนํžˆ ์ฝ”๋“œ ์ƒ์„ฑ์— ๋งค์šฐ ํŽธ๋ฆฌํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ผ๋ฐ˜์ ์œผ๋กœ ์กฐ์ง์˜ ์ž์œ ๋„๋ฅผ ๋†’์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ ์กฐ์ง์˜ ํƒ€๋ฅดํ•์—์„œ ๋ฒ—์–ด๋‚˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ž์œ ์ž…๋‹ˆ๋‹ค.

@david-driscoll ๋ถ€๋ถ„์„ ๊ฐ–๋Š” ์š”์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์Œ, ๋‹ค์‹œ ํ•œ ๋ฒˆ: ์ฝ”๋“œ ์ƒ์„ฑ.
์ œ์•ˆํ•œ ์†”๋ฃจ์…˜์˜ ๋ฌธ์ œ์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๋˜ ๋‹ค๋ฅธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•(๊ทธ๋ฆฌ๊ณ  ๊ฝค ๋”๋Ÿฌ์šด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•). ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ฐ€๋“ ์ฐฌ ํ˜•ํŽธ์—†๋Š” ์–ธ์–ด(javascrtipt)๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐœ๋ฐœ์ž๋Š” ์ฃผ์š” ์ž‘์—…์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๋Š” ๋Œ€์‹  ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๋Š” ๋ฐ ๋งŽ์€ ์‹œ๊ฐ„์„ ํ• ์• ํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ์ œ์•ˆํ•œ ์ฒ ํ•™์œผ๋กœ ์šฐ๋ฆฌ๋Š” ์ „์ฒด TypeScript ์–ธ์–ด๋ฅผ ๋ฒ„๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (๋†€๋ผ์›€, ๋†€๋ผ์›€) ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ์ „์ฒด ์œ ํ˜• ์‹œ์Šคํ…œ์„ ์ˆœ์ˆ˜ํ•œ ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋Œ€์•ˆ์œผ๋กœ ๋ฌด์—‡์ด๋“  ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋” ํ‘œํ˜„๋ ฅ์ด ํ’๋ถ€ํ•œ ์–ธ์–ด(์˜ˆ: Typescript)์— ๊ด€์‹ฌ์„ ๊ฐ–๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๊ฐ™์€ ๋‚ด์šฉ์„ ์Šค๋ฌด ์ค„๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์™œ ํ•œ ์ค„์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๊นŒ? ์ž‘์„ฑ๋œ ์ฝ”๋“œ ์ค„ ์ˆ˜์— ๋”ฐ๋ผ ๊ธ‰์—ฌ๋ฅผ ๋Œ๋ ค๋ฐ›์œผ์„ธ์š”! ์งง๊ณ  ํ‘œํ˜„๋ ฅ์ด ํ’๋ถ€ํ•œ ์ฝ”๋“œ๋Š” ๊ฒ์Ÿ์ด๋ฅผ ์œ„ํ•œ ๊ฒƒ ์•„๋‹™๋‹ˆ๊นŒ?

๊ทธ๋ฆฌ๊ณ  ์•„๋‹ˆ์˜ค: TypeScript์— ๋ถ€๋ถ„์„ ํฌํ•จํ•˜๋ผ๋Š” ์š”์ฒญ์€ C#์— ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋Š” ์ƒ๊ฐ์— ๊ธฐ๋ฐ˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” TypeScript์— ๋‹ค๋ฅธ ์–ธ์–ด๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๊ฒƒ์„ ๊ฐ–๊ธฐ ์œ„ํ•ด ๋ฌด์–ธ๊ฐ€๋ฅผ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ : ์™œ ๋‹น์‹ ์ด ๋ฌด์–ธ๊ฐ€๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์•„๋ฌด๋„ ๊ทธ๊ฒƒ์„ ํ•„์š”๋กœํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ?

@greendimka ์ €๋Š” ์ ๋Œ€๊ฐ์„ shield:. ๋‚˜๋Š” ๋‹จ์ˆœํžˆ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ดํ•ดํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ๊ฑฐ๋‚˜ ์†”์งํžˆ ์™„์ „ํžˆ ๊ฐ€๋Šฅํ•œ์ง€ ์ž˜ ๋ชจ๋ฅด๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ!

์ด์ œ ์ €๋Š” TypeScript ํŒ€์— ์žˆ์ง€ ์•Š๊ณ  ์˜นํ˜ธ์ž์ผ ๋ฟ์ด๋ผ๋Š” ์‚ฌ์‹ค์„ ๋ช…์‹ฌํ•˜์„ธ์š”. ํ•˜์ง€๋งŒ ํŒ€์€ ์—ฌ๊ธฐ์—์„œ ๊ฝค ์นจ๋ฌตํ–ˆ์Šต๋‹ˆ๋‹ค. ํŒ€์€ ๊ตฌ์ฒด์ ์œผ๋กœ ํ•  ๋ง์ด ์žˆ์„ ๋•Œ ์ž˜ ๋“ค์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ทธ๋“ค์ด ๊ทธ๋ ‡๊ฒŒ ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜๋ฉด ๋‚˜๋Š” ๊ทธ๋“ค์—๊ฒŒ ์—ฐ๊ธฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

TypeScript ํŒ€์ด ์œ ์ง€ํ•œ ํ•ต์‹ฌ ํ…Œ๋„ŒํŠธ ์ค‘ ํ•˜๋‚˜๋Š” TypeScript๋ฅผ ECMAScript์˜ ๋ฐฉํ–ฅ๊ณผ ๋™๊ธฐํ™”ํ•˜์—ฌ ๊ณ„์† ์›€์ง์ด๋„๋ก ํ•˜๊ณ  JavaScript๊ฐ€ ๋ฐœ์ „ํ•˜๋Š” ์ „์ฒด ๋ฐฉํ–ฅ์—์„œ ๋ฒ—์–ด๋‚  ์ˆ˜ ์žˆ๋Š” ํŠน์ • ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค(์กด์žฌํ•œ๋‹ค๋ฉด ์‚ฌ์šฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค). ๋ฌธ์ œ๋Š” ์ด ๋ฌธ์ œ์—์„œ ๋ถ€๋ถ„ ํด๋ž˜์Šค๊ฐ€ ๊ฒฝ๊ณ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ณง ๊ตฌํ˜„๋ ์ง€ ์˜์‹ฌ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. a) ๋†’์€ ๊ฐ€์น˜์˜ ์ดํ•ด ๊ด€๊ณ„์ž์—๊ฒŒ ํ•„์ˆ˜ ๊ธฐ๋Šฅ์ด ๋˜๊ฑฐ๋‚˜ b) ์ œ์•ˆ์ด TC39์˜ ํ›„๋ฐ˜ ๋‹จ๊ณ„๋กœ ๋“ค์–ด๊ฐˆ ๋•Œ๊นŒ์ง€ ํ•œ๋™์•ˆ ์ด ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” Module Augmentation์„ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ณด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์œ ํ˜• ์‹œ์Šคํ…œ์„ ๋ณด๊ฐ•ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด ์Šค๋ ˆ๋“œ์—์„œ ์ž์„ธํžˆ ์„ค๋ช…๋œ ๋งŽ์€ ์ฝ”๋“œ ์ƒ์„ฑ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹ค๋ฅธ ์–ธ์–ด ๊ธฐ๋Šฅ์„ ํ–ฅํ•œ ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค.

  • ๋ชป์ƒ๊ฒผ์–ด? ์ ˆ๋Œ€์ ์œผ๋กœ, ์ง€์˜ฅ์ฒ˜๋Ÿผ ์ถ”์•…ํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ƒ์„ฑ ๋„๊ตฌ๋งŒ ํด๋ž˜์Šค๋ฅผ ๋ณด๊ฐ•ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ ์ƒ์„ฑ ๋„๊ตฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๋ชจ๋“ˆ์„ ํฌํ•จํ•˜๋ฉด ์™„์ „ํ•œ ์ธํ…”๋ฆฌ์„ผ์Šค ๋ฐ ์ปดํŒŒ์ผ ์˜ค๋ฅ˜ ๋“ฑ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

  • ๊ทธ๊ฒƒ์€ ์™„๋ฒฝํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์—์„œ ๋ฉ€๋ฆฌ! ์–ธ์–ด ์ˆ˜์ค€์—์„œ ์ง€์›ํ•ด์•ผ ํ•˜๋Š” ๋ฏน์Šค์ธ์ด ์žˆ๋Š” ํ›จ์”ฌ ๋” ์ผ๋ฐ˜์ ์ธ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๋ด…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ ์—์„œ ์ œ์•ˆํ•œ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์™€ ์ผ๋งฅ์ƒํ†ตํ•˜๋Š” ๊ฒƒ์ด ํƒ€๋‹นํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ ๊ตฌ์ฒด์ ์ธ ์ œ์•ˆ์€ ์—†์Šต๋‹ˆ๋‹ค.

@david-driscoll, ๋งค์šฐ ๋ฌด๋ก€ํ•˜๊ฒŒ ํ•ด์„œ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ธ์ •์ ์ธ ๋ฐœ์ „์˜ ํŽธ์— ์„œ๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถ€๋ถ„ ํด๋ž˜์Šค์— ์ •์  ๊ตฌํ˜„์„ โ€‹โ€‹๋„ฃ์„ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๊ณง ์‹คํ˜„๋  ๊ฒƒ ๊ฐ™์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๊ฐ€ ์ฐพ์€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ œ์•ˆํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๋Œ“๊ธ€์ด ๋ช‡ ๊ฐœ ์žˆ๊ธด ํ•œ๋ฐ, ์ด๋Ÿฐ ๊ตฌ์ฒด์ ์ธ ๋‚ด์šฉ์ด ์žˆ๋Š” ๋Œ“๊ธ€์€ ๋ณธ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ƒ์„ฑ๋œ TypeScript ์ฝ”๋“œ๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•˜๋Š” ์ฝ”๋“œ ์ƒ์„ฑ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ Partials๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ์ƒํ˜ธ ์˜์กด์„ฑ์„ ๊ฐ€์ง„ ๋ชจ๋ธ์„ ์ƒ์„ฑํ•˜๋ฏ€๋กœ ํด๋ž˜์Šค์—์„œ ์ƒ์†ํ•˜๋Š” ๊ฒƒ์€ ์ „ํ†ต์ ์ธ ์˜๋ฏธ์—์„œ ์ž˜ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ์ฐธ์กฐํ•˜๋Š” ์ƒ์„ฑ๋œ ํด๋ž˜์Šค๋Š” ์ฐธ์กฐ๋˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ์œ ํ˜•์˜ ๊ฐ์ฒด๋กœ ๋๋‚˜์ง€ ์•Š์œผ๋ฉฐ ์˜ฌ๋ฐ”๋ฅธ ์ธ์Šคํ„ด์Šค ์œ ํ˜•์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋ณต์žกํ•œ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์œผ๋กœ ๋๋‚ฉ๋‹ˆ๋‹ค.

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

์˜ˆ๋ฅผ ๋“ค์–ด:
Person ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค๋ฉด ์ด์ œ PersonBase๋ฅผ ์ƒ์„ฑํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ƒ์„ฑ๋œ ๋ชจ๋“  ์ฝ”๋“œ๋Š” ์ด ํด๋ž˜์Šค์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. PersonBase๋ฅผ ํ™•์žฅํ•˜๋Š” ๋นˆ ํด๋ž˜์Šค Person๋„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ํด๋ž˜์Šค๋Š” ํ•œ ๋ฒˆ๋งŒ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ƒ์„ฑ๋œ ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ PersonBase์— ๋„ฃ๊ณ  ๋ชจ๋“  ์‚ฌ์šฉ์ž ์ง€์ • ์ฝ”๋“œ๋ฅผ ์ˆ˜๋™์œผ๋กœ Person์— ๋„ฃ์Šต๋‹ˆ๋‹ค. Person์— ๋Œ€ํ•ด ์ƒ์„ฑ๋œ ๋ชจ๋“  ์ฐธ์กฐ๋Š” PersonBase๊ฐ€ ์•„๋‹Œ Person์œผ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ชจ๋“  IntelliSense๊ฐ€ ๊ณ„์† ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

ํŒŒ์ผ 1: ๊ธฐ๋ณธ ํด๋ž˜์Šค

module ViewModels {
    export class PersonBase {
        // Generated members
        public anotherPerson: Person;
        constructor(){
            // Generated constructor code
        }
    }
}

ํŒŒ์ผ 2: ์‹ค์ œ ํด๋ž˜์Šค

module ViewModels {
    export class Person extends PersonBase {
        // Custom methods
        public NewVariable: string = "NewVar";
        constructor() {
            super();
            // Custom constructor code
        }
    }
}

์ด๊ฒƒ์€ ์ƒ์„ฑ๋œ ์ฝ”๋“œ์— ๋Œ€ํ•œ ๋ถ€๋ถ„ ํด๋ž˜์Šค ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์•„์ด๋””์–ด๋ฅผ ์ƒ๊ฐํ•ด ๋‚ธ Andrew Scott์—๊ฒŒ ๊ฒฝ์˜๋ฅผ ํ‘œํ•ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ๋กœ ์ผ๋ถ€ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์žˆ๊ณ  ์—ฌ๊ธฐ์— ๋ช‡ ๊ฐ€์ง€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ๋„ ์ •๋ง ์›ํ•ฉ๋‹ˆ๋‹ค. ๋ถ€๋ถ„ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‚˜์ค‘์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋‹ค์‹œ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ณ ๋„ ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(ํฌ๊ฑฐ๋‚˜ ๋ณต์žกํ•  ์ˆ˜ ์žˆ์Œ).

์•„์ง ์–ธ๊ธ‰๋˜์ง€ ์•Š์€ ๋ถ€๋ถ„ ํด๋ž˜์Šค๊ฐ€ ์žˆ์–ด์•ผ ํ•˜๋Š” ์ค‘์š”ํ•œ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. JS๋ฅผ TS๋กœ ์ ์ง„์ ์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Javascript, ํŠนํžˆ pre-ES6์—์„œ ํด๋ž˜์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Foo.prototype.someFunction = function() {/*....*/}

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

@RyanCavanaugh ์—ฌ๊ธฐ์—์„œ ์š”๊ตฌํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์€ ๋‹ค๋ฅธ TypeScript ๊ตฌ๋ฌธ์œผ๋กœ ๊ตฌ๋ฌธ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

mixin ์ œ์•ˆ์—๋Š” ํ›จ์”ฌ ๋” ๋งŽ์€ ์—ด๋ฆฐ ์งˆ๋ฌธ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ถ€๋ถ„ ํด๋ž˜์Šค ์ œ์•ˆ์€ TypeScript์—์„œ ์ด๋ฏธ ํ—ˆ์šฉ๋˜๋Š” ์ผ๋ถ€ ๊ตฌ๋ฌธ ์„คํƒ•๊ณผ ํ•จ๊ป˜ ์ฝ”๋“œํ™”ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค(์ด ๊ธฐ๋Šฅ์€ ๋ฌธ์ž ๊ทธ๋Œ€๋กœ ์ด๋ฏธ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ๊ตฌ๋ฌธ ์žฌ๋งคํ•‘์œผ๋กœ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ์Œ).

๊ทธ๋Ÿฌ๋ฉด TypeScript์—์„œ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?:
ํŒŒ์ผ1.ts:

// Imagine this file is code generated and could be regenerated during development
export partial class Contact
{
    firstName: string;
    lastName: string;
    partial OnInit( args: any ) : void;
    constuctor( args: any )
    {
        this.OnInit( args );
    }
}
export class Address
{
    addr: string;
    city: string;
    state: string;
    zip: string;
}

ํŒŒ์ผ2.ts

// See where I'm going with this? This file would be hand edited and allows me to specify associations and children.
partial class Contact
{
    Addresses: string[] = [];
    partial OnInit( args: any ) void
    {
        this.firstName = args.firstName;
        this.lastName = args.lastName;
        this.Addresses.push( new Address() );
    }
}

์œ„์˜ ๋‚ด์šฉ์„ ๋ณ€ํ™˜ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด Contact์— ๋Œ€ํ•ด ํ•˜๋‚˜์˜ JS ํด๋ž˜์Šค๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

var Contact = (function () {
    function Contact() {
         this.Addresses = [];
   }
   Contact.prototype.constuctor = function (args) {
       this.OnInit( args );
   };
   Contact.prototype.OnInit = function (args) {
       this.firstName = args.firstName;
       this.lastName = args.lastName;
       this.Addresses.push(new Address());
   };
   return Contact;
})();

var Address = (function () {
    function Address() {
    }
    return Address;
})();

๊ฒฐ๊ตญ ๋‚˜๋Š” Contact๋ผ๋Š” ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋ฅผ ์›ํ•˜๊ณ  ๋‘ ๊ฐœ์˜ ๊ฐœ๋ณ„ ํด๋ž˜์Šค๋ฅผ ์„ธ ๋ฒˆ์งธ ํด๋ž˜์Šค๋กœ ํ•˜์œ„ ํด๋ž˜์Šคํ™”ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@cosmoKenney

๋‹ค์Œ์€ ์ž‘๋™ํ•˜๋Š” ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค. partial ๋งŒํผ ๊ตฌ๋ฌธ์ ์œผ๋กœ ๊ณผ์žฅ๋˜์ง€๋Š” ์•Š์•˜์ง€๋งŒ ์ž‘๋™ํ•˜๊ณ  ๋งค์šฐ ๊ธฐ๋Šฅ์ ์ธ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค.

// address.ts
export class Address
{
    addr: string;
    city: string;
    state: string;
    zip: string;
}
// contact.impl.ts
import { Address } from './address';

// Class implementation, do the things here that are not code generated
export class Contact {
    firstName: string;
    lastName: string;
    addresses: Address[];
    constructor(args: any) {
        this.onInit(args);
    }
}
// extending the interface here
// define methods you know will need in the constructor only
// This only applies to the constructor however
export interface Contact {
    onInit(args: any): void;
}
// contact.partial.ts
import { Contact } from './contact.impl';

// Implement the extended contract here
Contact.prototype.onInit = function(this: Contact, args: any) {
    this.addresses = args.addresses.concat();
    // do stuff;
};

// Adding another method (not part of the extended interface)
Contact.prototype.somethingAwesome = function(this: Contact) {
    // do awesome stuff here
};

// Tell TypeScript "I added this here!!!!"
declare module './contact.impl' {
    interface Contact {
        somethingAwesome();
    }
}
// contact.ts
import { Contact } from './contact.impl';
import './contact.partial';

// Bring it all together (perhaps there are more than one partial class?)
export { Contact };
// main.ts
import { Contact } from './contact';

// use the contact!
const contact = new Contact(['my', 'args']);
const {firstName, lastName} = contact;
contact.somethingAwesome();

๋˜๋Š” ์ฝ”๋“œ์—์„œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ธํ„ฐํŽ˜์ด์Šค ํ™•์žฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด Mixin ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์•„์ง ์ด์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์„ค๋ช…ํ•˜์ง€ ์•Š์•„ ์ ์ ˆํ•œ ๋‹ต๋ณ€์„ ๋“œ๋ฆด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@david-driscoll ์™€์šฐ. ๋จธ๋ฆฌ๊ฐ€ ๋ง‰ ํญ๋ฐœํ–ˆ์Šต๋‹ˆ๋‹ค.

์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ์•Š๊ณ  ๋ถ€๋ถ„ ํด๋ž˜์Šค๋ฅผ ๋‹จ์ˆœํžˆ ์ง€์›ํ•˜๋Š” ํฌํฌ๋กœ ๋๋‚ ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.
์ง€๊ธˆ๊นŒ์ง€ ๋ถ€๋ถ„ ํด๋ž˜์Šค์— ๋Œ€ํ•œ ์‹ค์ œ ์ฃผ์žฅ์„ ๋“ฃ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒŒ์œผ๋ฆ„์„ ์ •๋‹นํ™”ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์ด์œ .

@greendimka

์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ์•Š๊ณ  ๋ถ€๋ถ„ ํด๋ž˜์Šค๋ฅผ ๋‹จ์ˆœํžˆ ์ง€์›ํ•˜๋Š” ํฌํฌ๋กœ ๋๋‚ ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.
์ง€๊ธˆ๊นŒ์ง€ ๋ถ€๋ถ„ ํด๋ž˜์Šค์— ๋Œ€ํ•œ ์‹ค์ œ ์ฃผ์žฅ์„ ๋“ฃ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒŒ์œผ๋ฆ„์„ ์ •๋‹นํ™”ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์ด์œ .

์—ฌ๊ธฐ์„œ ๋ฌด์—‡์„ ๋งํ•˜๋ ค๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ์ „๋ฐ˜์ ์ธ ๋Š๋‚Œ์ด ๊ธฐ์กด ์–ธ์–ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋ผ๋ฉด ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์œ„์— @david-driscoll์ด ๊ฒŒ์‹œํ•œ ๋‚ด์šฉ์€ ๋‚ด ์ดํ•ด๋ฅผ ํ›จ์”ฌ ๋›ฐ์–ด๋„˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฌธ์ œ๋ฅผ ์™„์ „ํžˆ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ๋‚ด๊ฐ€ ์•Œ ์ˆ˜ ์žˆ๋Š” ๋ฐ”์— ๋”ฐ๋ฅด๋ฉด ๊ทธ๋Š” ๋‚ด ์˜๋„๋ฅผ ์ž˜๋ชป ํ•ด์„ํ–ˆ๋‹ค.
๋‚ด ์ฃผ์š” ๊ด€์‹ฌ์‚ฌ๋Š” ์ฝ”๋“œ๊ฐ€ pojo ๋˜๋Š” ๋ชจ๋ธ ํด๋ž˜์Šค์™€ ๊ฐ™์€ ํด๋ž˜์Šค์˜ ์Šค์นผ๋ผ ์†์„ฑ์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ณ„๋„์˜ ํŒŒ์ผ์—์„œ ๋˜๋Š” ๋™์ผํ•œ ํŒŒ์ผ์—์„œ ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜์ง€๋งŒ ๊ธฐ๋ณธ ํด๋ž˜์Šค ์ •์˜ ๋‚ด์—์„œ๋Š” ์—ฐ๊ฒฐ ์†์„ฑ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ƒˆ๋กœ ์ฝ”๋“œ ์ƒ์„ฑ๋œ ๊ธฐ๋ณธ ์ •์˜๋ฅผ ์›๋ณธ ์œ„์— ๋ถ™์—ฌ๋„ฃ์„ ์ˆ˜ ์žˆ์Œ).
์˜ˆ๋ฅผ ๋“ค์–ด ์œ„์˜ ๋‚ด ์—ฐ๋ฝ์ฒ˜ ํด๋ž˜์Šค๋Š” firstName ๋ฐ lastName์œผ๋กœ ์ƒ์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ณ„๋„์˜ ์ •์˜์—์„œ Address ๊ฐœ์ฒด ์ปฌ๋ ‰์…˜์˜ ์ •์˜ ๋ฐ ์ดˆ๊ธฐํ™”๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
๋‚ด ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ๋Š” ์—ฐ๊ฒฐ์ด ์•„๋‹Œ ํด๋ž˜์Šค์˜ ์†์„ฑ๋งŒ ์•Œ๊ณ  ์žˆ์œผ๋ฏ€๋กœ david์˜ ์˜ˆ์—์„œ์™€ ๊ฐ™์ด ์ฃผ์†Œ ์ปฌ๋ ‰์…˜์„ ์ƒ์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@cosmoKenney ์ฃผ์†Œ๊ฐ€ ์–ด๋””์— ์žˆ์–ด์•ผ ํ•˜๋Š”์ง€ ์™„์ „ํžˆ ๋ช…ํ™•ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ฌธ๋งฅ์„ ์ž˜๋ชป ์ดํ•ดํ•œ ๊ฒƒ์„ ์šฉ์„œํ•˜์‹ญ์‹œ์˜ค. ๋‚˜๋Š” ๋‹จ์ง€ ๋Œ€์•ˆ์„ ์ œ์‹œํ•˜๋Š” ๊ฒƒ์„ ๋„์šฐ๋ ค๊ณ  ๋…ธ๋ ฅํ•  ๋ฟ์ž…๋‹ˆ๋‹ค. ๋‘ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ(๋‚ด๋ถ€/์™ธ๋ถ€)์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ๋งŽ์€ ์ถ”๊ฐ€ ๊ณ ๋ ค ์‚ฌํ•ญ๊ณผ ์ž ์žฌ์ ์ธ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๋ถ€๋ถ„ ํด๋ž˜์Šค์™€ ๊ฐ™์ด ์ปดํŒŒ์ผ๋Ÿฌ์— ๋ฌด์–ธ๊ฐ€๋ฅผ ๋„ฃ์ง€ ์•Š๊ณ ๋„ ์œ ์‚ฌํ•œ ๋™์ž‘์„ ํ—ˆ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ์ด ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ๊ฒฝ์šฐ ์ถ”์ƒ ๊ธฐ๋ณธ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค ์ƒ์„ฑ์ด ์ž‘๋™ํ•˜๋ฉด ๋‹ค๋ฅธ ํด๋ž˜์Šค๊ฐ€ ์ด๋ฅผ ์ƒ์†ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ํด๋ž˜์Šค๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ๋‹ค๋Š” ์‚ฌ์‹ค์ด ์—ฌ์ „ํžˆ ์ˆจ๊ฒจ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฆ‰:

// address.partial.ts
export interface IAddress
{
    addr: string;
    city: string;
    state: string;
    zip: string;
}

// address.ts
import { IAddress } from './address.partial';

export class Address
{
    constructor(args: any) {

    }
}
export interface Address extends IAddress{}

// contact.partial.ts
import { IAddress } from './address.partial';

export interface IContact {
    firstName: string;
    lastName: string;
    addresses: IAddress[];
}

// contact.ts
import { Address } from './address';
import { IContact } from './contact.partial';

// Class implementation, do the things here that are not code generated
export class Contact {
    addresses: Address[] = [];

    constructor(args: any) {
        this.firstName = args.firstName;
        this.lastName = args.lastName;
        this.addresses.push( new Address("address?") );
    }

    public somethingAwesome() {
        //
    }
}
export interface Contact extends IContact {}

// main.ts
import { Contact } from './contact';

const contact = new Contact(['my', 'args']);
const {firstName, lastName} = contact;
contact.somethingAwesome();

@cosmoKenney : @david-driscoll์€ ํฅ๋ฏธ๋กœ์šด ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ์‹ค์ œ ๋ถ€๋ถ„ ํด๋ž˜์Šค์˜ ์šฉ์ด์„ฑ์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ๊ฐœ์ธ์ ์ธ ์‹คํ—˜์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ๊ฐœ๋ฐœ์ž๋Š” ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ "๋ถ€๋ถ„"์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ข‹์€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด์ง€๋งŒ ๋ถ€๋ถ„์ ์ธ ์ž‘์—…์˜ ์šฉ์ดํ•จ๊ณผ ํŽธ์•ˆํ•จ์€ ์—†์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ TypeScript ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋ชจ๋“  ์†Œ์Šค ํŒŒ์ผ์„ ์ฝ๊ณ  ์ง„ํ–‰ํ•˜๊ณ  JS ํŒŒ์ผ์„ ์ถœ๋ ฅํ•œ๋‹ค๊ณ  ๊ฐ€์ • ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด - ์—ฌ๋Ÿฌ ์†Œ์Šค ํŒŒ์ผ์—์„œ ๋‹จ์ผ ํด๋ž˜์Šค๋ฅผ ์ฝ๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‹จ์ผ ํด๋ž˜์Šค์˜ ๋‘˜ ์ด์ƒ์˜ ์†Œ์Šค ํŒŒ์ผ์ด ์ถฉ๋Œํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ(๊ฐ™์€ ์†์„ฑ์ด ๋‘ ๋ฒˆ ์ •์˜๋จ) ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋‹จ์ˆœํžˆ ์˜ˆ์™ธ๋ฅผ throwํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ๋ฌธ์ƒ ์œ ํšจํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

@greendimka , @david-driscoll
์œ„์—์„œ David์˜ ์˜ˆ๋ฅผ ์ปดํŒŒ์ผํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ts๋Š” ๊ทธ๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

C:\TestProjects\TypeScriptFakePartialClassTest>tsc -m amd address.partial.ts address.ts contact.partial.ts contact.ts main.ts
address.ts(4,14): error TS2300: Duplicate identifier 'Address'.
address.ts(10,18): error TS2300: Duplicate identifier 'Address'.
contact.ts(7,14): error TS2300: Duplicate identifier 'Contact'.
contact.ts(11,14): error TS2339: Property 'firstName' does not exist on type 'Contact'.
contact.ts(12,14): error TS2339: Property 'lastName' does not exist on type 'Contact'.
contact.ts(20,18): error TS2300: Duplicate identifier 'Contact'.
main.ts(5,8): error TS2459: Type 'Contact' has no property 'firstName' and no string index signature.
main.ts(5,19): error TS2459: Type 'Contact' has no property 'lastName' and no string index signature.

๊ฒŒ๋‹ค๊ฐ€ ๋‚˜๋Š” ์ด๊ฒƒ์ด ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ˆ˜๋ฐฑ ๋ฒˆ ์‚ฌ์šฉํ•˜๊ธฐ์—๋Š” ๋„ˆ๋ฌด ๋ณต์žกํ•˜๋‹ค๋Š” @greendimka์˜ ๋ง์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

@greendimka ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ๋ชจ๋ฅด์ง€๋งŒ ์ž‘์—…์„ ๊ณผ์†Œ ํ‰๊ฐ€ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. JavaScript๋Š” .NET์ด ์•„๋‹ˆ๋ฉฐ ๋ชจ๋“ˆ์€ ์ „์—ญ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(๋ง ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์™€์•ผ ํ•จ).

๊ตฌํ˜„๋˜๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ์‹ถ์ง€๋งŒ ์ด ์ž‘์—…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹ ์ค‘ํ•˜๊ฒŒ ์ƒ๊ฐํ•ด์•ผ ํ•  ๋ช‡ ๊ฐ€์ง€ ์‚ฌํ•ญ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  • ํŒŒ์ผ A์— ํด๋ž˜์Šค์˜ ์ผ๋ถ€๋ฅผ ์ •์˜ํ•˜๊ณ  ํŒŒ์ผ B์— ์ผ๋ถ€๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒฝ์šฐ ํŠธ๋žœํŒŒ์ผ ํ›„ ์ „์ฒด ํด๋ž˜์Šค๋ฅผ ํฌํ•จํ•ด์•ผ ํ•˜๋Š” ํŒŒ์ผ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ƒˆ๋กœ์šด ๊ฒƒ์„ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?
  • ๋ถ€๋ถ„์ ์ธ ๋‚ด์šฉ์„ ํฌํ•จํ•˜๋Š” ๋ชจ๋“  ํŒŒ์ผ์ด ๋™์ผํ•œ ํด๋ž˜์Šค๋ฅผ ๋‚ด๋ณด๋‚ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?
  • ์ถ”๊ฐ€ ํŒŒ์ผ์— ๊ธฐ๋ณธ ํŒŒ์ผ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ˆœํ™˜ ์ข…์†์„ฑ์„ ํ”ผํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
  • ํด๋ž˜์Šค ์ž์ฒด๋ณด๋‹ค ๋ชจ๋“ˆ์—์„œ ๋” ๋งŽ์€ ๊ฒƒ์„ ๋‚ด๋ณด๋‚ด๋ฉด ์–ด๋–ป๊ฒŒ ๋ฉ๋‹ˆ๊นŒ?
  • ์ด๋ฆ„ ์ถฉ๋Œ ํ™•์ธ?

๋“ฑ๋“ฑ...

@greendimka ์•„๋ž˜ ๋‚ด ์‘๋‹ต์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. (ํŽธ์ง‘: @WoLfulus๋ฅผ ๋Œ€์ƒ์œผ๋กœ

ํŒŒ์ผ A์— ํด๋ž˜์Šค์˜ ์ผ๋ถ€๋ฅผ ์ •์˜ํ•˜๊ณ  ํŒŒ์ผ B์— ์ผ๋ถ€๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒฝ์šฐ ํŠธ๋žœํŒŒ์ผ ํ›„ ์ „์ฒด ํด๋ž˜์Šค๋ฅผ ํฌํ•จํ•ด์•ผ ํ•˜๋Š” ํŒŒ์ผ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ƒˆ๋กœ์šด ๊ฒƒ์„ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

ํŒŒ์ผ A.js์— ์ „์ฒด ์ •์˜๊ฐ€ ์žˆ๊ณ  ํŒŒ์ผ B์— ์Šคํ…์ด ์žˆ์œผ๋ฉด ์ •๋ง ๊ธฐ์  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฏธ๋ฆฌ ์ค€๋น„๋œ ๋Œ“๊ธ€์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ๋Œ€๋ถ€๋ถ„์€ ์–ด์จŒ๋“  ๋ฒˆ๋“ค๋กœ ๋ฌถ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฒˆ๋“ค๋กœ ์ œ๊ณต๋˜๋Š” ๋ฌด์ˆ˜ํ•œ .js ํŒŒ์ผ์€ ๊ฒฐ๊ตญ ๋ณธ์งˆ์ ์œผ๋กœ ๋‚˜์ค‘์— ์ƒ๊ฐํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋ถ€๋ถ„์ ์ธ ๋‚ด์šฉ์„ ํฌํ•จํ•˜๋Š” ๋ชจ๋“  ํŒŒ์ผ์ด ๋™์ผํ•œ ํด๋ž˜์Šค๋ฅผ ๋‚ด๋ณด๋‚ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

์ด๊ฒƒ์€ ์ฒซ ๋ฒˆ์งธ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‚˜์˜ ๋‹ต๋ณ€์œผ๋กœ ๊ฑฐ์˜ ๋‹ต์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ํŒŒ์ผ์— ๊ธฐ๋ณธ ํŒŒ์ผ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ˆœํ™˜ ์ข…์†์„ฑ์„ ํ”ผํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋ชจ๋ฅด๊ฒ ์–ด์š”. ์ด ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ธ์‹ํ•˜๋Š” ๊ฒƒ์ด ๋ชจ๋“ˆ ๋กœ๋”์˜ ์—ญํ• ์ด ์•„๋‹™๋‹ˆ๊นŒ?

ํด๋ž˜์Šค ์ž์ฒด๋ณด๋‹ค ๋ชจ๋“ˆ์—์„œ ๋” ๋งŽ์€ ๊ฒƒ์„ ๋‚ด๋ณด๋‚ด๋ฉด ์–ด๋–ป๊ฒŒ ๋ฉ๋‹ˆ๊นŒ?

๋‚˜๋Š” ์ด๊ฒƒ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ฆ‰, B.ts์— ๋ถ€๋ถ„ ์ •์˜์™€ ์ผ๋ถ€ ๋‹ค๋ฅธ ๋น„-๋ถ€๋ถ„ ํด๋ž˜์Šค๊ฐ€ ๋ชจ๋‘ ์žˆ๋Š” ๊ฒฝ์šฐ B.js์—๋Š” ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๋ฏธ๋ฆฌ ์ค€๋น„๋œ ์ฃผ์„๊ณผ ๋น„-๋ถ€๋ถ„ ํด๋ž˜์Šค์˜ ์ •์˜๊ฐ€ ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฆ„ ์ถฉ๋Œ ํ™•์ธ?

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

@WoLfulus , @cosmoKenney๋‹˜ ์ด ๋‹ต๋ณ€์„

@cosmoKenney

์ถ”๊ฐ€ ํŒŒ์ผ์— ๊ธฐ๋ณธ ํŒŒ์ผ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ˆœํ™˜ ์ข…์†์„ฑ์„ ํ”ผํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
๋ชจ๋ฅด๊ฒ ์–ด์š”. ์ด ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ธ์‹ํ•˜๋Š” ๊ฒƒ์ด ๋ชจ๋“ˆ ๋กœ๋”์˜ ์—ญํ• ์ด ์•„๋‹™๋‹ˆ๊นŒ?

TypeScript์—๋Š” ๋ชจ๋“ˆ ๋กœ๋”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

@greendimka

์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ์•Š๊ณ  ๋ถ€๋ถ„ ํด๋ž˜์Šค๋ฅผ ๋‹จ์ˆœํžˆ ์ง€์›ํ•˜๋Š” ํฌํฌ๋กœ ๋๋‚ ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.
์ง€๊ธˆ๊นŒ์ง€ ๋ถ€๋ถ„ ํด๋ž˜์Šค์— ๋Œ€ํ•œ ์‹ค์ œ ์ฃผ์žฅ์„ ๋“ฃ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒŒ์œผ๋ฆ„์„ ์ •๋‹นํ™”ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์ด์œ .

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

@WoLfulus , @cosmoKenney๋‹˜ ์ด ๋‹ต๋ณ€์„

๋‚˜๋Š” ๋‹น์‹ ์ด ๋‹น์‹ ์˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋งˆ์น˜ ์–ด๋–ค ์–ธ์–ด๋กœ๋“  ์ž์‹ ์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฐ ์ง๋ฉดํ•˜๋Š” ๋ชจ๋“  ์ œํ•œ์ด ์™„์ „ํžˆ ์ž„์˜์ ์ธ ์ด์œ ๋กœ ์กด์žฌํ•œ๋‹ค๊ณ  ๋Š๋ผ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค.
๋˜ํ•œ @WoLfulus '์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์ ์–ด๋„ ์ œ ๋งŒ์กฑ์€ ์•„๋‹™๋‹ˆ๋‹ค.

๋ˆ์Šค ํ”Œ๋ ˆ์ž„์ŠˆํŠธ

TL;DR: ์ด๊ฒƒ์€ ์ผ์–ด๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ ๋Œ“๊ธ€ ๋ฒˆํ˜ธ 189์— ์žˆ๊ณ  ์ด์— ๋Œ€ํ•œ ๋น„์Šน์ธ์„ ๋“ฑ๋กํ•˜๋ ค๋ฉด ๋จผ์ € ์ „์ฒด ์Šค๋ ˆ๋“œ๋ฅผ ์ฝ์œผ์‹ญ์‹œ์˜ค. ์ด ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š” ์ข‹์€ ์ด์œ ๋Š” ์œ„์—์„œ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ๋‹ค๋ฃจ์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด ์ƒํ™ฉ์— ๋Œ€ํ•œ ์šฐ๋ฆฌ์˜ ํ•ด์„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • TypeScript์—๋Š” "ES6 + ์œ ํ˜•"์œผ๋กœ ์˜๋„๋œ ๊ฒƒ์— ๋Œ€ํ•ด ์ด๋ฏธ ๋„ˆ๋ฌด ๋งŽ์€ TS ๊ด€๋ จ ํด๋ž˜์Šค ๊ธฐ๋Šฅ(์ƒ์„ฑ์ž ์†์„ฑ ์„ ์–ธ, ๋ฉค๋ฒ„ ์ด๋‹ˆ์…œ๋ผ์ด์ €, ๋ฏธ์™„์„ฑ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ, ์•ก์„ธ์Šค ์ˆ˜์ •์ž, implements ๋“ฑ)์ด ์žˆ์Šต๋‹ˆ๋‹ค. . ๊ทธ ์ค‘ ์ผ๋ถ€๋Š” ์šฐ๋ฆฌ์˜ ์ž˜๋ชป์ด๊ณ (์šฐ๋ฆฌ์˜ ์›๋ž˜ ๋””์ž์ธ ๋ฐฉํ–ฅ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋„ˆ๋ฌด OOP์˜€์Šต๋‹ˆ๋‹ค) ๊ทธ ์ค‘ ์ผ๋ถ€๋Š” ES6์˜ ์ž˜๋ชป์ž…๋‹ˆ๋‹ค(5๋…„ ์ „์— ํด๋ž˜์Šค ์ œ์•ˆ ์ด ๋งŽ์ด ์ด๋™ํ–ˆ๊ณ  ๊ฒฐ๊ตญ์—๋Š” ์ถฉ์กฑํ•˜์ง€ ๋ชปํ•œ ๊ธฐ๋Šฅ์„ ๊ฐ–๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค). ๋˜ ๋‹ค๋ฅธ TS ํŠน์ • ํด๋ž˜์Šค ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ ํ”ผํ•ด์•ผ ํ•˜๋Š” ๋‚™ํƒ€ ๋“ฑ์˜ ๋˜ ๋‹ค๋ฅธ ๋นจ๋Œ€์ž…๋‹ˆ๋‹ค.
  • ๋ถ„๋ช…ํžˆ JavaScript์˜ ๋ฏธ๋ž˜๋Š” ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค. ๋ถ€๋ถ„ ํด๋ž˜์Šค๋Š” "๊ธ€๋กœ๋ฒŒ ์ˆ˜ํ”„" ๋ชจ๋ธ์—์„œ๋งŒ ์˜๋ฏธ๊ฐ€ ์žˆ๊ณ  ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๋ชจ๋“ˆ์— ๊ฑธ์ณ ๋ถ€๋ถ„ ํด๋ž˜์Šค๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋กœ๋“œ ์ˆœ์„œ๋ฅผ ์˜ˆ์ธกํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์žฌ์•™์„ ์ดˆ๋ž˜ํ•ฉ๋‹ˆ๋‹ค. ์ „์—ญ ์ „์šฉ ์œ ๋‹ˆ๋ฒ„์Šค์—์„œ๋งŒ ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์‹œ๊ฐ„์„ ์ž˜ ํ™œ์šฉํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.
  • C#์ด ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ ์šฐ๋ฆฌ๋Š” C#์„ ์žฌ๋ฐœ๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๊ธฐ์— ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ง„์ง€ํ•˜๊ฒŒ!
  • "์ƒ์„ฑ๋œ ์ฝ”๋“œ" ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ์žฅ์ ์— ๋Œ€ํ•ด ์„ค๋“๋ ฅ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ถ€๋ถ„ ํด๋ž˜์Šค์— ๋Œ€ํ•œ ๊ทธ๋Ÿด๋“ฏํ•œ ๋ฐฉ์ถœ์€ ์†์„ฑ ์ด๋‹ˆ์…œ๋ผ์ด์ €์™€ ์ƒ์„ฑ์ž ์ฝ”๋“œ๋ฅผ ์ •ํ™•ํžˆ ํ•˜๋‚˜์˜ ์„ ์–ธ์œผ๋กœ ์ œํ•œํ•˜๋ฉฐ ์‚ฌ์šฉ์ž ์ฝ”๋“œ์™€ ์ƒ์„ฑ๋œ ์ฝ”๋“œ ๋ชจ๋‘ ์ด๋‹ˆ์…œ๋ผ์ด์ € ๋˜๋Š” ์ƒ์„ฑ์ž ๋…ผ๋ฆฌ๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ .Designer.cs ์Šคํƒ€์ผ ์„ค์ •์— ๋Œ€ํ•œ ๋”œ ๋ธŒ๋ ˆ์ด์ปค๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. .
  • JS์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ๋งŽ์€ ๊ตฌ์„ฑ ๋ฉ”์ปค๋‹ˆ์ฆ˜(mixins, Object.assign ๋“ฑ)์ด ์žˆ์Šต๋‹ˆ๋‹ค. C#์—์„œ ์ด ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ๋‹จ์ˆœํžˆ JS์—๋Š” ์—†๋Š” ์ œ์•ฝ ์กฐ๊ฑด์— ์˜ํ•ด ์ฃผ๋„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ํ˜„์žฌ ํ•ด๊ฒฐ interface + prototype.method = ... ๋‹จ์ง€๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ƒ์„ฑ ๋œ ์ฝ”๋“œ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์•Š์Šต๋‹ˆ๋‹ค partial class ๊ฒƒ. ๊ทธ ์ฝ”๋“œ๋ฅผ ์†์œผ๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ์ด์ƒํ•˜์ง€๋งŒ ์ฝ”๋“œ๋ฅผ ๋‹ค๋ฅด๊ฒŒ ์ƒ์„ฑํ•˜๋Š” ๋ฐ๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ถ„ํ•  ํŒŒ์ผ ์ƒ์„ฑ ์ฝ”๋“œ ์„ค์ •์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ •๋ง๋กœ ์ƒ๊ฐํ•œ๋‹ค๋ฉด(๋‚˜๋Š” ํšŒ์˜์ ์ž…๋‹ˆ๋‹ค) ๊ทธ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค .
  • ์šฐ๋ฆฌ๋Š” ES6์ด ์ˆ˜์—…์„ ์œ„ํ•œ "ํ•„์ˆ˜ํ’ˆ"์˜ ์ค‘์žฌ์ž๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. TypeScript๋Š” ํ˜•์‹์ด ์ง€์ •๋˜์ง€ ์•Š์€ JavaScript๋ณด๋‹ค ๋ถ€๋ถ„ ํด๋ž˜์Šค๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” C# ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ๋งค๋ ฅ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ํŠน๋ณ„ํ•œ ๊ฒƒ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ถ€๋ถ„ ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ์‹ค์ œ๋กœ ๊ทธ๊ฒƒ์„ ๊ณต์› ๋ฐ–์œผ๋กœ ๋‘๋“œ๋ฆฌ๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ทธ ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” TC39 ํ”„๋กœ์„ธ์Šค๋ฅผ ํ†ตํ•ด ์Šค์Šค๋กœ๋ฅผ ์ •๋‹นํ™”ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๊ฒฌ์ธ๋ ฅ์„ ์–ป๋Š”๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ์ž…๋ ฅ์œผ๋กœ ๋ฌด๊ฒŒ๋ฅผ ๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์˜๊ฒŒ ์ƒ๊ฐํ•˜์ง€๋งŒ ์ด๊ฒƒ์€ ๋ˆ„๊ตฌ์˜ ๋ ˆ์ด๋”์—๋„ ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•ด

interface + prototype.method = ...์˜ ํ˜„์žฌ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๋ถ€๋ถ„ ํด๋ž˜์Šค์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ƒ์„ฑ๋œ ์ฝ”๋“œ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ํ•œ ๋ฒˆ ์ด์ƒ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด, ๋‚ด๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ์„ ๋‹ฌ์„ฑํ•˜๋Š” ๋ฐ ๋ถ€๋ถ„์ ์ด์ง€ ์•Š๊ณ  C#์ด ์•„๋‹Œ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š” ๊ฒƒ์€ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ์ž‘์—… ์˜ˆ์ œ๋ฅผ ์š”์ฒญํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. david-driscoll์€ ๋งค์šฐ ๋„์›€์ด ๋˜์—ˆ์ง€๋งŒ ์ปดํŒŒ์ผ๋˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ๊ฒŒ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์˜ˆ๋ฅผ ๋“ค์–ด ์œ„์™€ ๊ฐ™์ด ์ด๋ฆ„, ์„ฑ์— ๋Œ€ํ•ด์„œ๋งŒ ์Šค์นผ๋ผ ์†์„ฑ์ด ์žˆ๋Š” ํด๋ž˜์Šค๋ฅผ ์ฝ”๋“œ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค๋ฉด ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์œ ํ˜•์˜ ์ปฌ๋ ‰์…˜์„ ์ง์ ‘ ์ฝ”๋”ฉํ•˜์—ฌ ํด๋ž˜์Šค์˜ ์†์„ฑ์œผ๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ ์„ธํŠธ์˜ ์ดˆ๊ธฐํ™”๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

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

์œ ๊ฐ์Šค๋Ÿฝ๊ฒŒ๋„ ์—ฌ๊ธฐ์—์„œ ๋‚ด๋ฆฐ ๋””์ž์ธ ๊ฒฐ์ •์„ ์กด์ค‘ํ•ฉ๋‹ˆ๋‹ค. ๊ดœ์ฐฎ์œผ์‹œ๋‹ค๋ฉด ๋ช‡ ๊ฐ€์ง€ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

TypeScript์—๋Š” "ES6 + ์œ ํ˜•"์œผ๋กœ ์˜๋„๋œ ๊ฒƒ์— ๋Œ€ํ•ด ์ด๋ฏธ ๋„ˆ๋ฌด ๋งŽ์€ TS ๊ด€๋ จ ํด๋ž˜์Šค ๊ธฐ๋Šฅ(์ƒ์„ฑ์ž ์†์„ฑ ์„ ์–ธ, ๋ฉค๋ฒ„ ์ด๋‹ˆ์…œ๋ผ์ด์ €, ๋ฏธ์™„์„ฑ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ, ์•ก์„ธ์Šค ์ˆ˜์ •์ž, ๊ตฌํ˜„ ๋“ฑ)์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ค‘ ์ผ๋ถ€๋Š” ์šฐ๋ฆฌ์˜ ์ž˜๋ชป์ด๊ณ (์šฐ๋ฆฌ์˜ ์›๋ž˜ ๋””์ž์ธ ๋ฐฉํ–ฅ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋„ˆ๋ฌด OOP์˜€์Šต๋‹ˆ๋‹ค) ๊ทธ ์ค‘ ์ผ๋ถ€๋Š” ES6์˜ ์ž˜๋ชป์ž…๋‹ˆ๋‹ค(5๋…„ ์ „์— ํด๋ž˜์Šค ์ œ์•ˆ์ด ๋งŽ์ด ์ด๋™ํ–ˆ๊ณ  ๊ฒฐ๊ตญ์—๋Š” ์ถฉ์กฑํ•˜์ง€ ๋ชปํ•œ ๊ธฐ๋Šฅ์„ ๊ฐ–๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค). ๋˜ ๋‹ค๋ฅธ TS ํŠน์ • ํด๋ž˜์Šค ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ ํ”ผํ•ด์•ผ ํ•˜๋Š” ๋‚™ํƒ€ ๋“ฑ์˜ ๋˜ ๋‹ค๋ฅธ ๋นจ๋Œ€์ž…๋‹ˆ๋‹ค.

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

TS๊ฐ€ ์ด๋Ÿฌํ•œ ๊ฒƒ๋“ค์„ ์„œ๋กœ ์บก์Šํ™”ํ•œ๋‹ค๋ฉด ๋Œ€์ฒดํ•˜๊ธฐ๋ณด๋‹ค๋Š” SoundScript์™€ ๊ฐ™์€ ํ”„๋กœ์ ํŠธ์—์„œ ์žฌ์‚ฌ์šฉํ•˜๊ณ  ๋ถ„๊ธฐํ•˜๊ณ  ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฌ์šธ๊นŒ์š”?

๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๋Š” ์ด ํƒ€์ดํ•‘์„ ๊ธฐ๋ฐ˜์œผ๋กœ JS๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋‚˜์€/๋‹ค๋ฅธ ์–ธ์–ด ๊ตฌ์„ฑ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถ„๋ช…ํžˆ JavaScript์˜ ๋ฏธ๋ž˜๋Š” ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค. ๋ถ€๋ถ„ ํด๋ž˜์Šค๋Š” "๊ธ€๋กœ๋ฒŒ ์ˆ˜ํ”„" ๋ชจ๋ธ์—์„œ๋งŒ ์˜๋ฏธ๊ฐ€ ์žˆ๊ณ  ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๋ชจ๋“ˆ์— ๊ฑธ์ณ ๋ถ€๋ถ„ ํด๋ž˜์Šค๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋กœ๋“œ ์ˆœ์„œ๋ฅผ ์˜ˆ์ธกํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์žฌ์•™์„ ์ดˆ๋ž˜ํ•ฉ๋‹ˆ๋‹ค. ์ „์—ญ ์ „์šฉ ์œ ๋‹ˆ๋ฒ„์Šค์—์„œ๋งŒ ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์‹œ๊ฐ„์„ ์ž˜ ํ™œ์šฉํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

์ง„์งœ์•ผ? ๋ชจ๋“ˆ์ด JavaScript์˜ ์ž์—ฐ์Šค๋Ÿฌ์šด ๋ถ€๋ถ„์ด ๋˜๊ฒ ์ง€๋งŒ, ์ฝ”๋“œ์˜ ์›๋ž˜ ๋ณธ๋ฌธ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” namspaces๋ฅผ ์ข‹์•„ํ•˜๋ฉฐ ์ œ๋Œ€๋กœ ์ˆ˜ํ–‰๋˜๋ฉด ์ˆ˜ํ”„๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ํ•˜๋‚˜์˜ ํŒŒ์ผ๋กœ ์ปดํŒŒ์ผํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๋ชจ๋“ˆ ๋กœ๋”๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ ๊ฑฐ์˜ โ€‹โ€‹๋ชจ๋“  ๊ฒฝ์šฐ์— ๋น„๋™๊ธฐ ๋ชจ๋“ˆ ๋กœ๋”ฉ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. https://github.com/Microsoft/TypeScript/issues/420 ๊ณผ ๊ฐ™์ด ์ œ์•ˆ๋œ ์ผ๋ถ€ ํ•ญ๋ชฉ์€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ๋งŒ ๊ฐ€๋Šฅํ•˜๊ณ  ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“ˆ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฐ ์ผ์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๋ง์”€์ด์‹ ๊ฐ€์š”? ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ์ง€์› ์ค‘๋‹จ์˜ ๊ธธ์— ์žˆ์Šต๋‹ˆ๊นŒ?

@david-driscoll ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ์ถฉ๋ถ„ํžˆ ๋„์›€์ด ๋˜์…จ์Šต๋‹ˆ๋‹ค. @RyanCavanaugh ๋Š” ๋ฌธ์ œ๋ฅผ ๊ณ„์† ๋‹ซ๊ณ  ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๊ณ  ๋งํ•˜๋Š” ์‚ฌ๋žŒ์ด๋ฏ€๋กœ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์˜ ์˜ˆ๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ๋ถ€๋ถ„ ํด๋ž˜์Šค๊ฐ€ ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•œ ๋งŽ์€ ์˜คํ•ด๋ฅผ ๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ •๋ง ๊ฐ„๋‹จํ•œ ๊ตฌ์„ฑ์ด๋ฉฐ ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์ด ์ด๊ฒƒ์„ ๊ณผ๋„ํ•˜๊ฒŒ ๋ถ€ํ’€๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
https://msdn.microsoft.com/en-us/library/wa80x488.aspx

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

๊ทธ๊ฒƒ์€ ์–ธ์–ด๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๊ณ  ๋ชจ๋“  ์‚ฌ๋žŒ์˜ ์ฝ”๋“œ๋ฅผ ๊นจ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ "๋ฉ‹์ง„ ๊ฑธ ์ค˜"๋ผ๋Š” ๊ฒƒ์€ TypeScript ์˜ CoffeeScript , Dart ๋˜๋Š” Haxe ์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ์–ธ์–ด๋ฅผ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  TypeScript ์ฑ„ํƒ์ด ์ž˜ ๋˜์ง€ ์•Š๋Š” ๋ฐ์—๋Š” ์ด์œ ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋ฅผ ๊ณ„์† ๋‹ซ๊ณ  ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๊ณ  ๋งํ•˜๋Š” ์‚ฌ๋žŒ์€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์˜ ์˜ˆ๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

partial ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๋งŽ์€ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฑฐ์˜ ๋ชจ๋“  ์–ธ์–ด ๊ตฌ์„ฑ์—๋Š” ์œ ํšจํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ๋งŽ์ง€๋งŒ ์ ์ ˆํ•œ ์ด์œ ๋กœ ์„ ํƒํ•˜๊ณ  ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

์ •๋‹นํ•œ ์ด์œ  ๋•Œ๋ฌธ์— ์ž๋™์ฐจ ํšŒ์‚ฌ๊ฐ€ ์นœํ™˜๊ฒฝ ์ž๋™์ฐจ๋ฅผ ์ƒ์‚ฐํ•˜์ง€ ์•Š๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž๋™์ฐจ๋ฅผ ๋‹ค์‹œ ์น ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค์ฃผ๋Š” ๊ฒƒ์ด Ryan์˜ ์˜๋ฌด๋ผ๊ณ  ๋Š๋ผ๋Š” ์ด์œ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

(์•„ ๊ทธ๋ฆฌ๊ณ  TypeScript 2.2์— ์ถ”๊ฐ€๋œ ๋ฏน์Šค์ธ ํด๋ž˜์Šค๋Š” ๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜๊ธฐ์— ์‹ค์ œ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋Š” ๊ฒƒ์„ ๋‹ฌ์„ฑํ•˜๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค)

interface Base {}

interface Constructor<T> {
    new (...args: any[]): T;
    prototype: T;
}

interface PartialClass {
    foo(): void;
}

function PartialClass<B extends Constructor<Base>>(base: B): B & Constructor<PartialClass> {
    return class extends base {
        foo() {
            console.log('foo');
        }
    };
}

class MyBase {
    bar() {
        console.log('bar');
    }
}

const MyPartialBase = PartialClass(MyBase);

const instance = new MyPartialBase();

instance.bar();
instance.foo();

@kitsonk ๋ฏน์Šค์ธ์€ ๊ฐ™์€ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

  • Mixin์€ ๊ธฐ์กด ํด๋ž˜์Šค์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ์ž์ฒด ํฌํ•จ๋œ ๋‹จ์œ„์ž…๋‹ˆ๋‹ค.
  • Partial ํด๋ž˜์Šค๋Š” ๋งˆ์น˜ ๊ฐ™์€ ํด๋ž˜์Šค์˜ ์ผ๋ถ€์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋‹ค๋ฅธ partial์˜ ๋ฉค๋ฒ„์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฐ์Šต์œผ๋กœ ๋ฏน์Šค์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ ์ฝ”๋“œ ๋ถ„ํ• ์„ ๊ตฌํ˜„ํ•ด ๋ณด์„ธ์š”.

partial class Point {
  readonly x: number;
  readonly y: number;
}

partial class Point {
  translate(dx: number, dy: number): Point {
    return new Point(this.x + dx, this.y + dy);
  }
}

์—ฐ์Šต์œผ๋กœ ๋‹ค์Œ ์ฝ”๋“œ ๋ถ„ํ• ์„ ๋ฏน์Šค์ธ์œผ๋กœ ๊ตฌํ˜„ํ•ด ๋ณด์„ธ์š”.

๋‹ค์‹œ ์š”์ ์œผ๋กœ ๋Œ์•„๊ฐ€์„œ... ์–ธ์–ด ๊ธฐ๋Šฅ์„ ์ง€์ ํ•˜๋Š” ๋Œ€์‹  ์˜ˆ์ œ์—์„œ ํ•ด๊ฒฐํ•˜๋ ค๋Š” ๋ฌธ์ œ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? TypeScript์˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ์‰ฝ๊ธฐ ๋•Œ๋ฌธ์—:

class Point {
  readonly x: number;
  readonly y: number;
  translate(dx: number, dy: number): Point {
    return new Point(this.x + dx, this.y + dy);
  }
}

(๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ์™„์ „ํ•˜์ง€๋งŒ ๋ชจ๋“  ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์•„๋‹Œ ์‚ฌ์šฉ์„ ํ•ด๊ฒฐ ํ•˜๋Š” ๊ฒฝ์šฐ)

interface PointBase {
    x: number;
    y: number;
}

interface Constructor<T> {
    new (...args: any[]): T;
    prototype: T;
}

interface TranslatePointPartial {
    translate(dx: number, dy: number): TranslatePointPartial;
}

function TranslatePointPartial<B extends Constructor<PointBase>>(base: B): B & Constructor<TranslatePointPartial> {
    return class TranslatePointPartial extends base {
        translate(dx: number, dy: number): TranslatePointPartial & PointBase {
            return new TranslatePointPartial(this.x + dx, this.y + dy);
        }
    };
}

class Point {
    readonly x: number;
    readonly y: number;
}

const MyPoint = TranslatePointPartial(Point);

const instance = new MyPoint();

instance.x;
instance.y;
instance.translate(1, 2);

@์ฝ”๋ผ๋ฆฌ ๋ฐฐ

์ด๋ฅผ ๊ณ ๋ คํ•  ๋•Œ JS์˜ ์ˆœ์ˆ˜ํ•œ ์œ ํ˜•๊ณผ TS๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋‹ค๋ฅธ ์–ธ์–ด ๊ตฌ์„ฑ์„ ์กฐ์ง์ ์œผ๋กœ ์ฝ”๋“œ์ ์œผ๋กœ ๋ช…ํ™•ํ•˜๊ฒŒ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์„๊นŒ์š”?

์ด ์‹œ์ ์—์„œ ๋‘˜์„ ๋ถ„๋ฆฌํ•  ๋ฐฉ๋ฒ•์ด ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ก ์ ์œผ๋กœ TypeScript๋กœ ๊ตฌ๋ฌธ์ ์œผ๋กœ ๋ณ€ํ™˜๋œ CoffeeScript ์–ธ์–ด๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์ด ๊ณ ๊ธ‰ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ TS์˜ ์œ ํ˜• ์‹œ์Šคํ…œ์„ ๊ณ„์† ์‚ฌ์šฉํ•˜๋ฉด์„œ ์ƒˆ๋กœ์šด ๊ตฌ๋ฌธ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์—ฌ๊ธฐ๊นŒ์ง€๋Š” ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋งŽ์€ ๋ฏธ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ JS๋กœ ์ปดํŒŒ์ผํ•˜๋Š” ์–ธ์–ด ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ๋ผ๋ฉด ๋” ๋‚˜์€ ์„ ํƒ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ชจ๋“ˆ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฐ ์ผ์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๋ง์”€์ด์‹ ๊ฐ€์š”? ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ์ง€์› ์ค‘๋‹จ์˜ ๊ธธ์— ์žˆ์Šต๋‹ˆ๊นŒ?

๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” ํ™•์‹คํžˆ ์•„๋ฌด๋ฐ๋„ ๊ฐ€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์€ ์ด๋ฏธ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ํŒจํ„ด์˜ ์ด๋ฆ„์ผ ๋ฟ์ด๋ฉฐ ES6 ๋ชจ๋“ˆ์˜ ์„ธ๊ณ„์—์„œ ์—ฌ์ „ํžˆ ์ถฉ๋ถ„ํžˆ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“ˆ์€ ์‚ฌ๋žŒ๋“ค์ด ์ฝ”๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ์‹์ด ์ ์  ๋” ๋Š˜์–ด๋‚˜๊ณ  ์žˆ์œผ๋ฉฐ ๋งŽ์€ ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹จ์ง€ ๋ถ€๋ถ„ ํด๋ž˜์Šค๊ฐ€ ๊ทธ ์„ธ๊ณ„์—์„œ ๊ฑฐ์˜ ์˜๋ฏธ๊ฐ€ ์—†์œผ๋ฉฐ, ๊ทธ๊ฒƒ๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๊ทผ๋ณธ์ ์œผ๋กœ ์ƒˆ๋กœ์šด ์กฐ์ง ํŒจํ„ด์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ด์ƒํ•  ๊ฒƒ์ด๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์„ธ์ƒ์ด ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ์œผ๋กœ ์›€์ง์ด๊ณ  ์žˆ๊ณ  ๋ชจ๋‘๊ฐ€ "๋ถ€์ž‘์šฉ์ด ์žˆ๋Š” ๊ธ€๋กœ๋ฒŒ ์Šคํฌ๋ฆฝํŠธ๋Š” ๊ต‰์žฅํ•˜๊ณ , ๋ชจ๋‘๊ฐ€ ์„œ๋กœ์˜ prototype s์— ํŒŒํ‹ฐ๋ฅผ ๋งบ๋Š”๋‹ค"๋ผ๊ณ  ํ•œ๋‹ค๋ฉด ์•„๋งˆ ์šฐ๋ฆฌ๋Š” ๋‹ค๋ฅด๊ฒŒ ๋Š๋‚„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@RyanCavanaugh

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

๊ฐ์‚ฌ ํ•ด์š”

์—ฌ๊ธฐ์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ C# API์— ๋Œ€ํ•œ typescript "proxy"๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ด๋Ÿฌํ•œ ๊ฐœ์ฒด๋ฅผ typescript์—์„œ ์‰ฝ๊ฒŒ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

์ €๋Š” JS ์ „๋ฌธ๊ฐ€๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ๋ˆ„๋ฝ๋œ ๊ฒƒ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ TS ํŒŒ์ผ์—์„œ ํด๋ž˜์Šค ์„ ์–ธ์„ ๋ถ„ํ• ํ•  ์ˆ˜ ์žˆ๋Š” ์ด์œ ๋ฅผ ์•Œ์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค(์ปดํŒŒ์ผ ํ›„ ํ•˜๋‚˜์˜ JS ํŒŒ์ผ์—์„œ๋งŒ ํ•˜๋‚˜์˜ ํด๋ž˜์Šค ์„ ์–ธ๋งŒ ์‚ฌ์šฉ). JS ์„ธ๊ณ„์˜ ๋ฌธ์ œ. ๋‚ด๊ฐ€ ๋ณด๊ธฐ์—๋Š” ๋งˆ์น˜ ์ฒ˜์Œ๋ถ€ํ„ฐ ํ•˜๋‚˜์˜ ํŒŒ์ผ์— ์ž‘์„ฑ๋œ ๊ฒƒ์ฒ˜๋Ÿผ JS์˜ ๊ฒฝ์šฐ ํˆฌ๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ๋ง์€, ๋ถ€๋ถ„ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋“  ์‚ฌ์šฉํ•˜์ง€ ์•Š๋“  JS ์ถœ๋ ฅ์€ ์ •ํ™•ํžˆ ๋™์ผํ•˜์ง€๋งŒ ๊ฐœ๋ฐœ์ž์˜ JS ๊ฐœ์ฒด ํ™•์žฅ ๋น„์šฉ์„ ๋ฐฉ์ง€ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@RyanCavanaugh

๊ฐœ์ธ์ ์œผ๋กœ ์–ธ๊ธ‰ํ•˜๊ณ  ์‹ถ์€ ๋˜ ํ•œ ๊ฐ€์ง€๋Š” ๋‹ค๋ฅธ TS ํŒŒ์ผ์˜ ๋ถ€๋ถ„ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ES6 ๋ชจ๋“ˆ์„ ์ƒ์„ฑํ•  ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ํŒจํ‚ค์ง• ๋”œ๋ ˆ๋งˆ๋ฅผ TS ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ์–ด๋–ป๊ฒŒ๋“  ํ•ด๊ฒฐํ•˜๋„๋ก ์š”์ฒญํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ TS ํŒŒ์ผ์„ ES6 ๋ชจ๋“ˆ์šฉ ๋‹จ์ผ js ํŒŒ์ผ๋กœ ์ปดํŒŒ์ผ... ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ๋ถ€๋ถ„ ํด๋ž˜์Šค๋Š” ์ฝ”๋“œ ์ƒ์„ฑ์— ํฌ๊ฒŒ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค... ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ํ™•์žฅ์„ฑ๊ณผ ํ•จ๊ป˜ ๋ชจ๋ธ์˜ ํฐ ๋ถ€๋ถ„์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค...

@kitsonk

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

์•„๋‹ˆ์š”, ๋” ์ด์ƒ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์š”๊ตฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์–ธ์–ด๊ฐ€ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์„ ์„ฑ์ทจํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ๋ฐ˜๋ณตํ•ด์„œ ์–ธ๊ธ‰๋˜์–ด ์™”์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ(C#์—์„œ)์— ๋Œ€ํ•œ ์˜ˆ๋ฅผ ์ œ๊ณตํ–ˆ์ง€๋งŒ ์œ ์šฉํ•œ ์˜ˆ์—์„œ ๋‚ด๊ฐ€ ์žˆ์–ด์•ผ ํ•  ์œ„์น˜์— ๋„๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•„์ง ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

์ •๋‹นํ•œ ์ด์œ  ๋•Œ๋ฌธ์— ์ž๋™์ฐจ ํšŒ์‚ฌ๊ฐ€ ์นœํ™˜๊ฒฝ ์ž๋™์ฐจ๋ฅผ ์ƒ์‚ฐํ•˜์ง€ ์•Š๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž๋™์ฐจ๋ฅผ ๋‹ค์‹œ ์น ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค์ฃผ๋Š” ๊ฒƒ์ด Ryan์˜ ์˜๋ฌด๋ผ๊ณ  ๋Š๋ผ๋Š” ์ด์œ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

Ryan์€ ์—ฌ๊ธฐ์—์„œ ์ค‘์žฌ์ž์ธ ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฉฐ ๋ฌธ์ œ๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์—. ๊ทธ๊ฐ€ ์–ธ์–ด ๊ถŒ์œ„์ž๋ผ๋ฉด ์•„๋งˆ๋„ ๋‚ด ํ•„์š”๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•˜๊ณ  ๋ชจ๊ตญ์–ด ๊ธฐ๋Šฅ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์˜ˆ๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๊ณ  ์ด ์š”์ฒญ์„ ๋ฌด์‹œํ•˜๊ธฐ ์ „์— ๋ฌธ์ œ๋ฅผ ์ข…๋ฃŒํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„ ์†”๋ฃจ์…˜์„ ์›ํ•œ๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ €๋Š” ๊ฝค ์ข‹์€ ๊ฐœ๋ฐœ์ž์ด๋ฉฐ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๋ชจํ˜ธํ•œ ์–ธ์–ด๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๊ณ  ์žˆ๋Š”๋ฐ๋„ ์—ฌ์ „ํžˆ mixin ๊ตฌ๋ฌธ์— ์–ด๋ ค์›€์„ ๊ฒช๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๋ณต์žกํ•˜๊ณ  ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์šด ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์–ธ์–ด์— ๋“ค์–ด์™”๋Š”์ง€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜์ง€๋งŒ C#์—์„œ ์ฐจ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์ด ๋ถ€๋ถ„ ํด๋ž˜์Šค ๊ตฌ๋ฌธ์˜ ์šฐ์•„ํ•จ์„ ๊ฑฐ๋ถ€ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Ryan์€ ์—ฌ๊ธฐ์—์„œ ์ค‘์žฌ์ž์ธ ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฉฐ ๋ฌธ์ œ๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์—. ๊ทธ๊ฐ€ ์–ธ์–ด ๊ถŒ์œ„์ž๋ผ๋ฉด ์•„๋งˆ๋„ ๋‚ด ํ•„์š”๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•˜๊ธฐ ์ „์— ๋ฌธ์ œ๋ฅผ ๋‹ซ์ง€ ๋ง์•„์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๐Ÿค”

@RyanCavanaugh , ๋‚˜๋Š” ๋‹น์‹ ์ด ๋•๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ์‹œ์ ์—์„œ ๋ฏน์Šค์ธ์„ ์‹œ๋„ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์•„๋‹ˆ๋ฉด ๊ทธ๋ƒฅ ์ƒ์†, ์•„๋‹ˆ๋ฉด ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ์™„๋ฃŒํ•˜๋Š” ๋ฐ ๋„ˆ๋ฌด ๊ธ‰ํ•ด์„œ ์ œ๋„ค๋ฆญ์œผ๋กœ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ฐ„๊ณผํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ ...
์ƒ์† ๋ฐ ์ด๋ฆ„ ์ง€์ •์„ ํ†ตํ•ด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

class AddressBase // this is a code generated class
{
    public address: string;
    public city: string;
    public state: string;
    public zip: string;

    constructor( jsonFromService: any )
    {
        this.OnInit( jsonFromService );
    }

    OnInit( jsonFromService: any )
    {
        // could use Object.assign here
        this.address = jsonFromService.address;
        this.city = jsonFromService.city;
        this.state = jsonFromService.state;
        this.zip = jsonFromService.zip;
    }
}

class ContactBase // this is also a code generated class
{
    public firstName: string;
    public lastName: string;

    constructor( jsonFromService: any )
    {
        this.OnInit( jsonFromService );
    }

    OnInit( jsonFromService: any )
    {
        // could use Object.assign here
        this.firstName = jsonFromService.firstName;
        this.lastName = jsonFromService.lastName;
    }
}

// classes that extend the functionality of the code generated classes:
class Address extends AddressBase // subclass simply because I don't want to have to use AddressBase all over my codebase, and then refactor if I ever extend the class
{
}

class Contact extends ContactBase
{
    public Addresses: Address[] = []; // THIS is the customization/extension that cannot be code generated.

    OnInit( jsonFromService: any )
    {
        // note that jsonFromService receives a dto with a array of address info
        super.OnInit( jsonFromService );

        for ( let addr of jsonFromService.Addresses )
        {
            this.Addresses.push( new Address( addr ) );
        }
    }
}

๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์˜ˆ์˜์ง€ ์•Š์œผ๋ฉฐ ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์ง€ ์•Š์€ ์ด๋ฆ„์„ ๋‚ด ์ฝ”๋“œ ์ƒ์„ฑ ํด๋ž˜์Šค์— ๊ฐ•์ œ๋กœ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹ค์‹œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ๋ถ€๋ถ„๊ณ„๊ธ‰์„ ๊ฐ•๋ ฅํ•˜๊ฒŒ ๋ฐ˜๋Œ€ํ•˜๋Š” ๋‚จ์„ฑ๋“ค์€ ๋ถ€๋ถ„๊ณ„๊ธ‰์˜ ๊ฐœ๋…์„ ์ž˜๋ชป ์ดํ•ดํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™๊ณ , ๋ถ€๋ถ„๊ณ„๊ธ‰์€ ๋ถ€๋ถ„๊ณ„๊ธ‰์ด ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ช…ํ™•ํžˆ ํ•˜์ž๋ฉด, ๋ถ€๋ถ„ ํด๋ž˜์Šค๋Š” ๋™์ผํ•œ ๋‹จ์ผ ํด๋ž˜์Šค์˜ ์ •์˜๋ฅผ ์—ฌ๋Ÿฌ ๋ฌผ๋ฆฌ์  ํŒŒ์ผ๋กœ ๋ถ„ํ• ํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ๋ฌธ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ํ‚ค์›Œ๋“œ๋Š” "๋™์ผ" ๋ฐ "๋‹จ์ผ"์ž…๋‹ˆ๋‹ค.

TypeScript์˜ ๋ฌธ์„œ๋Š” ๋ถ€๋ถ„ ํด๋ž˜์Šค์— ๋Œ€ํ•œ ์ž˜๋ชป๋œ ์ •์˜๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค(์—ฌ๊ธฐ์˜ ์ฒซ ๋ฒˆ์งธ ๋‹จ๋ฝ: https://www.typescriptlang.org/docs/handbook/mixins.html ).

์‹ค์ œ ๋ถ€๋ถ„ ํด๋ž˜์Šค ๊ฐœ๋…์˜ ์˜ˆ:

"Point.generated.ts" ํŒŒ์ผ:

partial class Point {
   readonly x: number;
   readonly y: number;
}

ํŒŒ์ผ "Point.codeByHand.ts":

partial class Point {
  constructor(x: number, y: number) {
      this.x = x;
      this.y = y;
  }

  translate(dx: number, dy: number): Point 
  {
      return new Point(this.x + dx, this.y + dy);
  }
}

"Point.js"๋กœ ์ปดํŒŒ์ผ๋˜๋ฉฐ ์ด๋ฆ„์€ ํŒŒ์ผ ์ด๋ฆ„์ด ์•„๋‹Œ ํด๋ž˜์Šค ์ด๋ฆ„์—์„œ ๋‚˜์˜ต๋‹ˆ๋‹ค.

var Point = (function () {
    function Point(x, y) {
        this.x = x;
        this.y = y;
    }
    Point.prototype.translate = function (dx, dy) {
        return new Point(this.x + dx, this.y + dy);
    };
    return Point;
}());

Mixins๋Š” "๋ถ€๋ถ„ ํด๋ž˜์Šค"๋กœ ์‚ฌ์šฉ๋  ๋•Œ(๋ฌธ์„œ์—์„œ ์ด ์šฉ์–ด๊ฐ€ ์ž˜๋ชป ์‚ฌ์šฉ ๋˜์—ˆ๋‹ค๊ณ  ๊ฐ•๋ ฅํ•˜๊ฒŒ ๋ฏฟ์Šต๋‹ˆ๋‹ค) ์‹ค์ œ๋กœ ๋‹ค์ค‘ ์ƒ์†( https://en.wikipedia.org/wiki/Multiple_inheritance )์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

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

IMHO, ์ด ํ† ๋ก ์—๋Š” ๋ฏธ๋ž˜๊ฐ€ ์—†์œผ๋ฉฐ ์ค‘๋‹จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ๋ถ€๋ถ„ ํด๋ž˜์Šค์— ๋Œ€ํ•œ ๊ธฐ์ˆ ์ ์ธ ๋ฌธ์ œ๋Š” ์•„์ง ๋ณด์ด์ง€ ์•Š์ง€๋งŒ ํŒ€์€ ์ ์–ด๋„ ํ˜„์žฌ๋กœ์„œ๋Š” ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

TS ํŒ€์€ ๊ฐ€๋Šฅํ•˜๋ฉด TS ๊ด€๋ จ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋” ๋…ผ์˜ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์—ฌ๊ธฐ๊ฐ€ ๋” ์ข‹์Šต๋‹ˆ๋‹ค: https://esdiscuss.org/topic/class-syntax-enhancements

TC39 ์ธก ์— GitHub repo๊ฐ€ โ€‹โ€‹์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๋ฉ”์ผ๋ง์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ด ๋ฌธ์ œ๋ฅผ ๋…ผ์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

@greendimka

ํ˜„์žฌ ๋ถ€๋ถ„๊ณ„๊ธ‰์„ ๊ฐ•๋ ฅํ•˜๊ฒŒ ๋ฐ˜๋Œ€ํ•˜๋Š” ๋‚จ์„ฑ๋“ค์€ ๋ถ€๋ถ„๊ณ„๊ธ‰์˜ ๊ฐœ๋…์„ ์ž˜๋ชป ์ดํ•ดํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™๊ณ , ๋ถ€๋ถ„๊ณ„๊ธ‰์€ ๋ถ€๋ถ„๊ณ„๊ธ‰์ด ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ช…ํ™•ํžˆ ํ•˜์ž๋ฉด, ๋ถ€๋ถ„ ํด๋ž˜์Šค๋Š” ๋™์ผํ•œ ๋‹จ์ผ ํด๋ž˜์Šค์˜ ์ •์˜๋ฅผ ์—ฌ๋Ÿฌ ๋ฌผ๋ฆฌ์  ํŒŒ์ผ๋กœ ๋ถ„ํ• ํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ๋ฌธ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ํ‚ค์›Œ๋“œ๋Š” "๋™์ผ" ๋ฐ "๋‹จ์ผ"์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ์žˆ๋Š” ๋ˆ„๊ตฌ๋„ ๋ถ€๋ถ„ ํด๋ž˜์Šค์˜ ์ •์˜๋ฅผ ์˜คํ•ดํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ JavaScript์˜ ํด๋ž˜์Šค ์ •์˜๋ฅผ ์˜คํ•ดํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

JavaScript ํด๋ž˜์Šค๊ฐ€ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ํด๋ž˜์Šค์™€ ์ „ํ˜€ ๋น„์Šทํ•˜๋‹ค๋Š” ์ธ์ƒ์„ ๋ฐ›๊ณ  ์žˆ๋‹ค๋ฉด ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์˜คํ•ดํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ด _๋‚˜ํƒ€๋‚˜๋Š”__ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด ํ† ๋ก ์—์„œ ์—ฌ๋Ÿฌ ๋ฒˆ ๋งํ–ˆ๋“ฏ์ด ์ ์–ด๋„ ํ•œ ๋ฒˆ์€ ๋ช…์‹œ์ ์œผ๋กœ ๋งํ–ˆ๋“ฏ์ด JavaScript ํด๋ž˜์Šค๋Š” ์„ ์–ธ์  ๊ตฌ์„ฑ์ด ์•„๋‹ˆ๋ผ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.

๋ช…๋ น๋ฌธ์ด ์‹คํ–‰๋  ๋•Œ๊นŒ์ง€ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ๋“ค์„ ์ •์˜ํ•˜๋Š” ๊ฒƒ์€ ๋Œ์—ฐ๋ณ€์ด์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ƒ์†๊ณผ ๊ด€๋ จํ•˜์—ฌ ์ด๋ฏธ ๋ถ€์„œ์ง€๊ธฐ ์‰ฝ๊ณ  ์ˆœ์„œ์— ์˜์กดํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์ด ๊ณ„์† ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ...

@cosmoKenney

๊ทธ ๋ณต์žกํ•˜๊ณ  ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์šด ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์–ธ์–ด์— ๋“ค์–ด์™”๋Š”์ง€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜์ง€๋งŒ C#์—์„œ ์ฐจ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์ด ๋ถ€๋ถ„ ํด๋ž˜์Šค ๊ตฌ๋ฌธ์˜ ์šฐ์•„ํ•จ์„ ๊ฑฐ๋ถ€ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ •๋ง ์˜ณ์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Java ํ”„๋กœ๊ทธ๋ž˜๋จธ ๐Ÿ˜›๋ฅผ ๋น„๋กฏํ•œ ๋ชจ๋“  ์‚ฌ๋žŒ์ด C#์„ ์‚ฌ๋ž‘ํ•˜๊ณ  TypeScript๋Š” ๋‹ค๋ฅด๋‹ค๊ณ  ํ•ด์„œ ๋‹ค๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@aluanhaddad

JavaScript์˜ ํด๋ž˜์Šค ์ •์˜๋ฅผ ์ž˜๋ชป ์ดํ•ดํ•˜๊ณ  ๊ณ„์‹  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค...

์ธ์šฉ ๋ฐ ์ดํ•˜: TypeScript์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๋‚ด๊ฐ€ ๋งํ–ˆ๋“ฏ์ด: JavaScript์˜ ๊ตฌ์„ฑ์œผ๋กœ ์ปดํŒŒ์ผ๋  TypeScript์—์„œ ์‹ค์ œ ๋ถ€๋ถ„ ํด๋ž˜์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ธฐ์ˆ ์ ์ธ ๋ฌธ์ œ๋Š” ์—†์Šต๋‹ˆ๋‹ค.

@greendimka

์ธ์šฉ ๋ฐ ์ดํ•˜: TypeScript์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๋‚ด๊ฐ€ ๋งํ–ˆ๋“ฏ์ด: JavaScript์˜ ๊ตฌ์„ฑ์œผ๋กœ ์ปดํŒŒ์ผ๋  TypeScript์—์„œ ์‹ค์ œ ๋ถ€๋ถ„ ํด๋ž˜์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ธฐ์ˆ ์ ์ธ ๋ฌธ์ œ๋Š” ์—†์Šต๋‹ˆ๋‹ค.

์ด ๋งŒ์กฑ์˜ ๋ฌธ์ œ๋Š” TypeScript ํด๋ž˜์Šค์™€ ๊ฐ™์€ ๊ฒƒ์ด ์—†์Šต๋‹ˆ๋‹ค.

์˜ค ์†Œ๋…„! ์–ด๋–ค ์‚ฌ๋žŒ๋“ค์€ ์ด์œ ๋ฅผ ๋ฌด์—‡์ด๋“  ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ข‹์•„, TypeScript์—๋Š” ํด๋ž˜์Šค๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋˜๋Š” TypeScript ํด๋ž˜์Šค. ๋˜๋Š” ๋ฌด์—‡์ด๋“ . ๋ฌด์—‡์ด๋“ .

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

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ˆ˜์—…์— ๋Œ€ํ•ด ๋งํ•  ๋•Œ ๊ฐ™์€ ๊ฒƒ์„ ์˜๋ฏธํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ธ์ง€ ๋ถ€์กฐํ™”๋ฅผ ์ผ์œผํ‚ค๊ณ  ์ƒํ˜ธ ์ดํ•ด๋ฅผ ๋ฐฉํ•ดํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ์ˆ˜์—…์— ๋Œ€ํ•ด ๋งํ•  ๋•Œ ๊ฐ™์€ ๊ฒƒ์„ ์˜๋ฏธํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์•„์š”. ์ธ์ง€ ๋ถ€์กฐํ™”๋ฅผ ์ผ์œผํ‚ค๊ณ  ์ƒํ˜ธ ์ดํ•ด๋ฅผ ๋ฐฉํ•ดํ•ฉ๋‹ˆ๋‹ค..
์ „์ ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค!

์‹ค์ œ๋กœ ์ด ์ฃผ์ œ์˜ ์ฒซ ๋ฒˆ์งธ ๊ฒŒ์‹œ๋ฌผ์€ ์š”์ฒญ๋œ ๋‚ด์šฉ์„ ์™„๋ฒฝํ•˜๊ฒŒ ์„ค๋ช…ํ•˜๋ฏ€๋กœ ์ด ํ† ๋ก ์—๋Š” ๋ฏธ๋ž˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. :)

@greendimka ์˜ˆ, TypeScript์— ๋ถ€๋ถ„ ํด๋ž˜์Šค๊ฐ€ ์—†์„ ๊ฒƒ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์— ๋ฏธ๋ž˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ œ ์ƒ๊ฐ์—๋Š” ์ข‹์€ ์ผ์ž…๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์˜คํ•ด์™€ ์˜คํ•ด๋Š” ์ข‹์€ ๊ฒŒ ์•„๋‹ˆ๋ผ์„œ ์•„์ง๋„ ๋„ˆ์™€ ๋Œ€ํ™”๋ฅผ ํ•˜๊ณ  ์žˆ๋‹ค.

๋ถˆํ–‰ํžˆ๋„, ๋‹น์‹ ์€ ์–ด๋Š ์ชฝ์—๋„ ๊ด€์‹ฌ์ด ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค

A. JavaScript๊ฐ€ ํด๋ž˜์Šค๋ผ๋Š” ๊ฒƒ์„ ์„ค๋ช…ํ•˜๋ฉด ๋งˆ์Œ์ด ๋ฐ”๋€Œ๊ณ  ์‰ฝ๊ฒŒ ๋ถ€๋ถ„ํ™”๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

B. JavaScript ํด๋ž˜์Šค๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์—๊ฒŒ์„œ ๋ฐฐ์šฐ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜๋Œ€๋˜๋Š” ๊ด€์ ์„ ์ดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ๋ถ€๋„๋Ÿฌ์šด ์ผ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๋‹น์‹ ์ด ์›ํ•œ๋‹ค๋ฉด ๋” ์ด์ƒ ๋…ผ์˜ํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์–ด๋–ค ํ† ๋ก ์—๋„ ๋ฐ˜๋Œ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ถ€๋ถ„ ํด๋ž˜์Šค๋Š” ๊ตฌํ˜„๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์—ฌ๊ธฐ์—์„œ ์—ฌ๋Ÿฌ ๋ฒˆ ์–ธ๊ธ‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค(์ ์–ด๋„ ์ง€๊ธˆ์€ ์•„๋‹˜). ๊ทธ๋ž˜์„œ ๋‹ค๋ฅธ ์ผ์— ์ง‘์ค‘ํ•˜๋Š” ๊ฒŒ ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”. ์•„๋งˆ๋„ TypeScript๋Š” ๋ฏธ๋ž˜์— ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ฐ€ ์•Œ๊ฒ ์Šต๋‹ˆ๊นŒ?
A์™€ B์™€ ๊ด€๋ จํ•˜์—ฌ. ๋‚˜๋Š” JavaScript๋ฅผ ์‹ซ์–ดํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์•„์ฃผ ์ž˜ ์•Œ๊ณ  ์žˆ์œผ๋ฉฐ ๋ฌผ๋ก  ํด๋ž˜์Šค๊ฐ€ ์–ด๋–ป๊ฒŒ "ํ‘œํ˜„"๋˜๋Š”์ง€ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ์ „์ฒด ํ† ๋ก ์˜ ์š”์ ์€ JavaScript๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ "๋‚ฎ์€ ์ˆ˜์ค€" JavaScript ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ƒ์œ„ ์–ธ์–ด์ธ TypeScript์˜ ๊ธฐ๋Šฅ์„ ๊ฐœ์„ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
TypeScript๋ฅผ C++๋กœ, JavaScript๋ฅผ ๊ธฐ๊ณ„์–ด ์ฝ”๋“œ๋กœ ๋Œ€์ฒดํ•œ๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ณด์‹ญ์‹œ์˜ค. ๊ธฐ๊ณ„ ์ฝ”๋“œ์—๋Š” C++์— ์กด์žฌํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ฐœ๋…์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ C++๋Š” ๊ทธ๊ฒƒ ๋•Œ๋ฌธ์— ์ง„ํ™”๋ฅผ ๋ฉˆ์ถฐ์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๋ฌผ๋ก  ์•„๋‹™๋‹ˆ๋‹ค. ์ผ๋ถ€ ์˜ค๋ž˜๋œ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ปดํŒŒ์ผํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ์„ ์ค‘๋‹จํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๋ฌผ๋ก  ์•„๋‹™๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ณ  ์ƒˆ๋กœ์šด ์ปดํŒŒ์ผ๋Ÿฌ์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•œ๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ ์—ฌ๋ถ€๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

@aluanhaddad
๋งจ ์˜ค ๋งจ. ๋ˆ„๊ฐ€ ๋ฐฉ์ •์‹์˜ Javascript ๋ถ€๋ถ„์— ์‹ ๊ฒฝ์„ ์“ฐ๋‚˜์š”? TypeScript๋Š” ์œ„์˜ ๋ ˆ์ด์–ด์ด๊ฑฐ๋‚˜ ์›ํ•˜๋Š” ๋ฌธ๊ตฌ์ž…๋‹ˆ๋‹ค. ์ด์ „ 4GL ๋Œ€ 3GL ํ† ๋ก ์„ ๊ธฐ์–ตํ•˜์‹ญ๋‹ˆ๊นŒ? TypeScript๋Š” 4GL์ด 3GL์ธ ๊ฒƒ์ฒ˜๋Ÿผ JavaScript์— ๋Œ€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ TypeScript๊ฐ€ ๊ฐ•๋ ฅํ•œ ์œ ํ˜•์˜ ES6์ด๋ฏ€๋กœ Partial Classes๊ฐ€ TypeScript์˜ ๋กœ๋“œ๋งต ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚ฌ๋‹ค๋Š” ์ฃผ์žฅ์€ LAME์ž…๋‹ˆ๋‹ค. Mixins, Generics, Modules, Name Spaces ๋ฐ Type Casting์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด Partial Classes๋กœ ๋” ๋งŽ์€ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์ด์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๊นŒ?

๋ถ€๋ถ„ ํด๋ž˜์Šค์—์„œ ์›ํ•˜๋Š” ๊ฒƒ์€ ๋‹จ์ผ TypeScript ํด๋ž˜์Šค์˜ ๋ชจ๋“  ๋‹ค์–‘ํ•œ ์ •์˜๋ฅผ ํ•˜๋‚˜์˜ ์ตœ์ข… - ๋‚ฎ์€ ์ˆ˜์ค€ - 3GL - Javascript ํด๋ž˜์Šค ์ •์˜๋กœ ๋ณ‘ํ•ฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ตฌ๋ฌธ ์„คํƒ•์ž…๋‹ˆ๋‹ค. ์ตœ์ข… JavaScript ํด๋ž˜์Šค ์ •์˜์—๋Š” ์˜ํ–ฅ์ด ์—†์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋งž์ฃ ? Javascript๋กœ์˜ ๋ณ€ํ™˜์˜ ์ตœ์ข… ์ œํ’ˆ์ด ์ด ํ† ๋ก ์˜ ์ผ๋ถ€์ธ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ง„์ง€ํ•˜๊ฒŒ.

@cosmoKenney "์œ ํ˜•์ด ์žˆ๋Š” Scala.js ๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์„ธ์š”.

ํŽธ์ง‘: ๋ฐฉ๊ธˆ ES.next์—์„œ ๋ถ€๋ถ„ ํด๋ž˜์Šค๊ฐ€ ์‚ฌ์šฉ์ž ์ •์˜ ๋ชจ๋“ˆ ๋กœ๋”๋กœ ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ํฅ๋ฏธ๋กœ์šด ์‚ฌ์‹ค์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

import {MyClass} from './myclass.*'

๋กœ๋”๋Š” ์™€์ผ๋“œ์นด๋“œ์™€ ์ผ์น˜ํ•˜๋Š” ๋ชจ๋“  ํŒŒ์ผ์—์„œ ๋‚ด๋ณด๋‚ธ ๋ชจ๋“  MyClass ์ •์˜๋ฅผ ๋‹จ์ผ ํด๋ž˜์Šค๋กœ ๋ณ‘ํ•ฉํ•œ ๋‹ค์Œ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@spion ๋‚˜๋Š” ๋‹น์‹ ์ด ๊ทธ๊ฒƒ๋“ค์„ ES.next ๋ถ€๋ถ„ ํด๋ž˜์Šค๋กœ ์•„์ฃผ โ€‹โ€‹์ •ํ™•ํ•˜๊ฒŒ ์–ธ๊ธ‰ํ•˜๋Š” ๋ฐฉ์‹์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €์™€ ๊ฐ™์€ ES ๋ชจ๋“ˆ ๋กœ๋” ๋˜๋Š” SystemJS์™€ ๊ฐ™์€ ๋กœ๋” ํด๋ฆฌํ•„์€ ๋ถ€๋ถ„ ํด๋ž˜์Šค๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
TypeScript ์ˆ˜์ค€์—์„œ ์ด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ฃผ์š” ๋ฌธ์ œ ์ค‘ ํ•˜๋‚˜๋Š” ๋กœ๋” ๋ฐ ํŒจํ‚ค์ง€ ๋„๊ตฌ์™€ ๊ฐ™์€ ๊ธฐ์กด ๋„๊ตฌ๊ฐ€ ์†์ƒ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— ECMAScript์—์„œ ์ง€์ •ํ–ˆ๋‹ค๋ฉด ์ด๋Ÿฌํ•œ ๋ชจ๋“  ๋„๊ตฌ๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ณ  TypeScript๋Š” ์ด๋Ÿฌํ•œ ๋ชจ๋“  ๋„๊ตฌ์™€ ๊ณ„์† ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค.

Scala.js์— ๋Œ€ํ•ด ํ™•์‹คํžˆ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

@cosmoKenney

Mixins, Generics, Modules, Name Spaces ๋ฐ Type Casting์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด Partial Classes๋กœ ๋” ๋งŽ์€ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์ด์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๊นŒ?

TypeScript์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋ฏน์Šค์ธ์€ TypeScript _types_์ธ ECMAScript ๋””์ž์ธ ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

์ œ๋„ค๋ฆญ์€ ์œ ํ˜• ์‹œ์Šคํ…œ ๊ธฐ๋Šฅ์ด๋ฏ€๋กœ ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ชจ๋“ˆ์€ ECMAScript ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” ECMAScript ๋””์ž์ธ ํŒจํ„ด์„ ์œ„ํ•œ ๊ตฌ๋ฌธ์  ์„คํƒ•์ด์ž ํ˜•์‹ํ™”์ž…๋‹ˆ๋‹ค.

ํƒ€์ž… ์บ์ŠคํŒ…์€ TypeScript์— ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@aluanhaddad ์™œ ์ด๊ฒƒ์„ ๋Ÿฐํƒ€์ž„์œผ๋กœ ๊ณ„์† ๋งŒ๋“ค๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ๋ชจ๋“ˆ ๋กœ๋” ๋ฐ ํŠธ๋žœ์ŠคํŒŒ์ผ๊ณผ ๊ด€๋ จ์ด ์—†๋Š” ๋ชจ๋“  ๊ฒƒ.

+1

@cosmoKenney

@aluanhaddad ์™œ ์ด๊ฒƒ์„ ๋Ÿฐํƒ€์ž„์œผ๋กœ ๊ณ„์† ๋งŒ๋“ค๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ๋ชจ๋“ˆ ๋กœ๋” ๋ฐ ํŠธ๋žœ์ŠคํŒŒ์ผ๊ณผ ๊ด€๋ จ์ด ์—†๋Š” ๋ชจ๋“  ๊ฒƒ.

๊ทธ๊ฒƒ์€ ์˜ณ์ง€ ์•Š๋‹ค.

SystemJS ๋ฐ Webpack ์—์ฝ”์‹œ์Šคํ…œ์„ ์‚ดํŽด๋ณด๋ฉด ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ›จ์”ฌ ๋” ์ „ํ†ต์ ์ด๊ณ  ๊ฒฌ๊ณ ํ•œ gulp ์›Œํฌํ”Œ๋กœ์šฐ๋Š” ์ž…๋ ฅ ํŒŒ์ผ๊ณผ ์ถœ๋ ฅ ํŒŒ์ผ ๊ฐ„์˜ ๋Œ€์‘์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค.

+1

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

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰