๋ถ๋ถ ํด๋์ค ์ง์์ ์ถ๊ฐํฉ๋๋ค. 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!"; }
}
๋๋ ๋น์ ์ด ๋ชจ๋์ "๋ถ๋ถ์ "์ ์ฌ์ฉํ๊ณ ์ฌ๊ธฐ์์ ์ ๊ธฐ๋ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๋์์ ์ค๋ค๊ณ ์๊ฐํฉ๋๋ค.
@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ํ๋ฉด ๊ณ์ ์งํ๋์ง ์์ต๋๋ค.
์ง๊ธ๊น์ง์ ์ฌ์ฉ ์ฌ๋ก๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋ ๋ฒ์งธ์ ์ธ ๋ฒ์งธ ์ฌ์ฉ ์ฌ๋ก๋ ์ค๋๋ ฅ์ด ์๊ณ ๋ค ๋ฒ์งธ๋ #9๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ด ์ด๋ป๊ฒ ๋งค์ฐ ์ ์ฌํ ์๊ตฌ ์ฌํญ๊ณผ ๋ฐ์ฝ๋ ์ดํฐ(#2249)๋ฅผ ์ถฉ์กฑํ์ง ๋ชปํ๋์ง์ ๋ํ ์ค๋ช ์ด ์ด๋ ์ ๋ ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
#9๊ฐ ๋์ผํ ์์ ์ ์ํํ๊ณ ํจ์ฌ ๋ ์ผ๋ฐ์ ์ผ ๊ฒ ๊ฐ์ต๋๋ค(์์ ์ ํด๋์ค๊ฐ ์๋ ๋ค๋ฅธ ํด๋์ค๋ฅผ ํ์ฅํ ์ ์๊ธฐ ๋๋ฌธ์). ๊ทธ๋ฌ๋ ๋ ๊ฐ์ ํ์ผ์ ํด๋์ค ๋ด์ฉ์ด ์๊ณ (ํ๋๋ ์์ผ๋ก ์์ฑํ๊ณ ๋ค๋ฅธ ํ๋๋ ํ ํ๋ฆฟ์ผ๋ก ์์ฑํ๊ธฐ ๋๋ฌธ์) ๋ ํ์ผ ๋ชจ๋ ํด๋์ค์ ํ์ ๊ตฌ์ฑ์์ ๋์ผํ ์ค์์ฑ์ผ๋ก ์ ์ํ๊ณ ๊ทธ ์ค ํ๋๋ฅผ ์๊ตฌํ์ง ์๋๋ค๊ณ ๋งํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ผ ์ ์์ต๋๋ค. ํ์ผ "ํ์ฅ" ํด๋์ค ์ ์ ๋ค๋ฅธ.
๊ฑฐ์ ์ค์กด์ ์ธ ์ฐจ์ด์ง๋ง ์ด๋ค ์ํฉ์์๋ ์ผ๋ถ ์ฌ๋๋ค์๊ฒ ์ค์ํ ์ ์์ต๋๋ค.
๋ช ์๋ ์ด์ ๋ก ํด๋์ค์์ ๋ถ๋ถ์ ์ธ ๊ฒ์ ์ํ์ง ์์ง๋ง ๋ชจ๋์์๋ IMHO๊ฐ ์๋ฏธ๊ฐ ์์ต๋๋ค.
๋ถ๋ถ ํด๋์ค๋ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ ๋ฌธํํ๋ ๋ฐ ๋งค์ฐ ์ ์ฉํฉ๋๋ค. ์ด๊ฒ์ OOP ํจํด์ ๋ํ ์๋ฐ์ด ์๋๋ผ ๋ค์์ ์ ๊ณตํ๋ ์ฝ๋ ๋ฌธ์๋ฅผ ์ ๋ ฌํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
์ ๋ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๋ฐ์ดํฐ ๋ ์ด์ด๋ฅผ ๋ณ๋์ ํด๋์ค๋ก ๋ถ๋ฆฌํ๋ ๊ฒ์ ๋ฏฟ์ผ๋ฉฐ ์ฃผ๋ก ์ด๋ฌํ ๋ ์ด์ด์์ ์ ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ๋ ๋ง์ ์ฝ๋์ ๋ ์ ์ง ๋ณด์๊ฐ ๋ ์ ์๋ค๋ ๊ฒ์ ์ ๋ง๋ก ์์ง ๋ชปํฉ๋๋ค.
ํ์ฅ ๋ฉ์๋๋ ๊ฐ์ฒด์งํฅ ํจํด์ ์ํฅ์ ๋ฐ๋ ํต์ฌ ์ธ์ด ๊ธฐ๋ฅ์ผ๋ก ์ปดํ์ผ ์ ์ฒ๋ฆฌ๋์ง๋ง ๋ถ๋ถ ํด๋์ค๋ ์ปดํ์ผ ์ ๋จ๊ณ์์ ์คํฐ์นญ๋๋ ๋ฌธ์/์ฝ๋ ๋ ์ด์์์ ์ฒ๋ฆฌํฉ๋๋ค. ๋ถ๋ถ ํด๋์ค, ์ถ์ ํด๋์ค ๋ฐ ํ์ฅ ๋ฉ์๋์ ์ ์ฌ์ฑ์๋ ๋ถ๊ตฌํ๊ณ ๋ถ๋ช ํ ์ฐจ์ด์ ์ด ์์ต๋๋ค.
:+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
.
์์์ ์ธ๋ชจ์๋ ์ด๋ฆ ์ปคํ๋ง์ ๋ง๋ญ๋๋ค.
์์์ ๋ค์๊ณผ ๊ฐ์ ์ด์ ๋ก ๋ ํ๋ฅญํฉ๋๋ค.
typescript์ codegen์ ์ง์ํ๋ ๋ถ๋ถ ํด๋์ค๊ฐ ์๋ค๊ณ ๋งํ์ง ์๊ณ
๋ถ๋ถ ํด๋์ค๊ฐ ์์์ด๋
๊ตฌ์ฑ.
@JoshMcCullough JS์ ์์ ์ค๋ฒํค๋๋ ์ต์ํ๋๋ฉฐ ๋ถ๋ถ ํด๋์ค๋ณด๋ค ์ผ๋ง๋ ์ง์ ๋ถํ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ฉด ์ ์ฌ์ ์ผ๋ก ํด๋์ค๋ฅผ 10๊ฐ์ ํ์ผ๋ก ๋ถํ ํ๊ณ ๋ชจ๋ ๊ณณ์์ ๋ฉ์๋๋ฅผ ์ถ์ ํ ์ ์์ต๋๋ค.
@yahiko00 ์ฌ๊ธฐ์ ๋งํ๋ "์ธ๋ชจ์๋ ์ด๋ฆ ์ปคํ๋ง"์ด๋? ์๋ 2๋ฒ(ํ์ฅ ํด๋์ค์ ์ด๋ฆ์ ํ๋์ฝ๋ฉ)์ ์ป๊ธฐ ์ํด ํด์ผ ํ ์ผ์ ์ธ๊ธํฉ๋๊น?
@hdachev
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
๋ค์ ๋ ๊ฐ์ง ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๋ชจ๋ ์ถฉ์กฑํด์ผ ํ๋ ์ ์์ด ์์ต๋๋ค.
(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๋ฐ์ดํฐ ๊ตฌ์กฐ ํ์ฅ
๊ฐ์์ฌ๊ธฐ() { ... }
}
๋ฐ์ค๊ณผ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ฒ๊ณผ ๊ฐ์ ๋ค๋ฅธ ๊ฒ๋ค ์ค์์
๊ธฐ๋ณธ์ ์ผ๋ก ๊ตฌ๋ฌธ์์ ์ด์ ์ ์ป๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
๋ด์ฅ ์ ํ์ ์ค์ ๋ก ์ค์ผ์ํค์ง ์๊ณ ํ์ฅํฉ๋๋ค.
๋๋ฌด ๊ฐ๋จํฉ๋๋ค - ๋์ ํ๋์ ๋์ผํ ๊ฒ์ผ๋ก ์ทจ๊ธํ์ง ๋ง์ญ์์ค. ๋ ๋ค ๋งค์ฐ
๋ฉ์ง์ง๋ง ๊ฐ์ ๊ฒ์ ์๋๋๋ค. ๋๋ ๊ฐ์ธ์ ์ผ๋ก ๋ ๋ค ์ฐ๋ฆฌ์
์ธ์ด.
๊ทธ๊ฑด ๊ทธ๋ ๊ณ , ๋ถ์์ ์ผ๋ก ๋ง์ ์ฌ๋๋ค์ด
์ฝ๋ ์์ฑ ๋ฐ ๋ชจ๋ ์ฌ๋์๊ฒ ๊ทธ๊ฒ์ด ์๋ฆฌ๊ฐ ์๋ค๋ ๊ฒ์ ์ค๋ช
ํ ์ค๋น๊ฐ ๋์ด ์์ต๋๋ค.
์๋ฐ ์คํฌ๋ฆฝํธ์์ ๊ฐ์ ๊ฒ์ ๋ฌ์ฑํ๋ ๋ ๊ด์ฉ์ ์ธ ๋ฐฉ๋ฒ์ด ์๊ธฐ ๋๋ฌธ์
๋๋ค.
์ฝ๋ ์์ฑ์ด ์ผ๋ถ์์ ํฐ ๋์์ด ๋๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
๋ด๊ฐ ์ง๊ธ ํ๊ณ ์๋ ๊ฒ๊ณผ ๊ฐ์ ํ๋ก์ ํธ.
์ด๋ค ๋ถ๋ถ์ด ๊ถ๊ธํ์ ๋ถ๋ค์ ์ํด ๋ ๋ค๋ฅธ ์ฌ์ด๋ ๋
ธ๋๋ก
ํด๋์ค๋ ์์ฑ๋ ๋ถ๋ถ์ ์ ์งํ๋ ๊ฐ์น์ธ 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์ ๋ถ๋ถ ํด๋์ค ๊ฐ๋ ์๋ ๋ค์๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
_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;
}
}
๊ทธ ๋ค์์...
MyClass
๋๋๋ก๋ถํฐ ๊ฐ์ ธ์ฌ ํ์๊ฐ MyClass.ts
MyClass.partial.ts
๋ ์ด์ ์ ์ฌ๊ธฐ์ ํ์๋ ๊ฒ์ฒ๋ผ MyClass.prototype
๋ฅผ ํ์ฅํ๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํฉ๋๋ค. ๊ทธ๋ฌ๋ ํ์ฅํ ํ๋กํ ํ์
์ ๋ฐ๋ ํจ์๋ฅผ ๋ด๋ณด๋
๋๋ค.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์ ์๋ ๋ชจ๋ ํญ๋ชฉ์ด ์๋์ผ๋ก ๋ณํฉ๋์ง ์์ต๋๋ค.
์ธ๋ถ ์ปดํ์ผ์ ์ฌ์ฉํ๋ฉด ๊ฐ ๋ชจ๋์๋ ๋ชจ๋ ์ข ์์ฑ(๊ฐ์ ธ์ค๊ธฐ)๊ณผ ๋ชจ๋ ๊ณต๊ฐ API(๋ด๋ณด๋ด๊ธฐ)์ ๋ํ ๋ช ์์ ๋ชฉ๋ก์ด ์๊ธฐ ๋๋ฌธ์ ๊ฐ ํ์ผ์ ์ค์ ๋ก ๋ชจ๋(๋๋ .NET ์ธ๊ณ์์๋ ์ง์ฅ ์ด์ ๋ธ๋ฆฌ)์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์ด๋ฌํ ์๋๋ฆฌ์ค์ ๋ํด ์ด๋ป๊ฒ ์ถ๋ก ํฉ๋๊น?
ํ์ผ ์ฐธ์กฐ๊ฐ ํ๋๋ง ์ฃผ์ด์ง๋ฉด ํด๋์ค์ ๋์์ ๋ฌด์์
๋๊น?
Class2์ Class3์ ์๋์ผ๋ก ๋ณํฉํฉ๋๊น?
// 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์ด ์๋๋ฉฐ ๋ชจ๋์ ์ ์ญ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค(๋ง ๊ทธ๋๋ก ๊ฐ์ ธ์์ผ ํจ).
๊ตฌํ๋๋ ๊ฒ์ ๋ณด๊ณ ์ถ์ง๋ง ์ด ์์ ์ ๋ค์๊ณผ ๊ฐ์ด ์ ์คํ๊ฒ ์๊ฐํด์ผ ํ ๋ช ๊ฐ์ง ์ฌํญ์ ์ ๊ณตํฉ๋๋ค.
๋ฑ๋ฑ...
@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์ ์๊ณ ์ด์ ๋ํ ๋น์น์ธ์ ๋ฑ๋กํ๋ ค๋ฉด ๋จผ์ ์ ์ฒด ์ค๋ ๋๋ฅผ ์ฝ์ผ์ญ์์ค. ์ด ํญ๋ชฉ์ ์ถ๊ฐํ์ง ์๋ ์ข์ ์ด์ ๋ ์์์ ๊ด๋ฒ์ํ๊ฒ ๋ค๋ฃจ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ด ์ํฉ์ ๋ํ ์ฐ๋ฆฌ์ ํด์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
implements
๋ฑ)์ด ์์ต๋๋ค. . ๊ทธ ์ค ์ผ๋ถ๋ ์ฐ๋ฆฌ์ ์๋ชป์ด๊ณ (์ฐ๋ฆฌ์ ์๋ ๋์์ธ ๋ฐฉํฅ์ ์ผ๋ฐ์ ์ผ๋ก ๋๋ฌด OOP์์ต๋๋ค) ๊ทธ ์ค ์ผ๋ถ๋ ES6์ ์๋ชป์
๋๋ค(5๋
์ ์ ํด๋์ค ์ ์ ์ด ๋ง์ด ์ด๋ํ๊ณ ๊ฒฐ๊ตญ์๋ ์ถฉ์กฑํ์ง ๋ชปํ ๊ธฐ๋ฅ์ ๊ฐ๊ฒ ๋์์ต๋๋ค). ๋ ๋ค๋ฅธ TS ํน์ ํด๋์ค ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ๊ฒ์ ์ฐ๋ฆฌ๊ฐ ํ ์ ์๋ ํ ํผํด์ผ ํ๋ ๋ํ ๋ฑ์ ๋ ๋ค๋ฅธ ๋นจ๋์
๋๋ค..Designer.cs
์คํ์ผ ์ค์ ์ ๋ํ ๋ ๋ธ๋ ์ด์ปค๊ฐ ๋ฉ๋๋ค. .Object.assign
๋ฑ)์ด ์์ต๋๋ค. C#์์ ์ด ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์๋๋ฆฌ์ค๋ ๋จ์ํ JS์๋ ์๋ ์ ์ฝ ์กฐ๊ฑด์ ์ํด ์ฃผ๋๋์์ต๋๋ค.interface
+ prototype.method = ...
๋จ์ง๋ฟ๋ง ์๋๋ผ ์์ฑ ๋ ์ฝ๋ ์๋๋ฆฌ์ค๋ฅผ ๊ฐ๋ฅํ๊ฒ ์์ต๋๋ค partial class
๊ฒ. ๊ทธ ์ฝ๋๋ฅผ ์์ผ๋ก ์์ฑํ๋ ๊ฒ์ ์ด์ํ์ง๋ง ์ฝ๋๋ฅผ ๋ค๋ฅด๊ฒ ์์ฑํ๋ ๋ฐ๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ถํ ํ์ผ ์์ฑ ์ฝ๋ ์ค์ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ์ ๋ง๋ก ์๊ฐํ๋ค๋ฉด(๋๋ ํ์์ ์
๋๋ค) ๊ทธ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์์ต๋๋ค .์ด์ ๋ํด
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 ๋ฏน์ค์ธ์ ๊ฐ์ ๊ฒ์ด ์๋๋๋ค.
์ฐ์ต์ผ๋ก ๋ฏน์ค์ธ์ ์ฌ์ฉํ์ฌ ๋ค์ ์ฝ๋ ๋ถํ ์ ๊ตฌํํด ๋ณด์ธ์.
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
๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋๋ถ๋ถ์ ๊ธฐ๋ณธ ํด๋์ค๋ฅผ ์์ฑํ๊ธฐ ๋๋ฌธ์ ๋ถ๋ถ ํด๋์ค๊ฐ ํ์ํฉ๋๋ค(๋ชจ๋ธ์ ๋ณ๊ฒฝ ์ฌํญ์ด ์์ ๋ ์๋ํํ๊ธฐ ์ํด). ๊ทธ๋ฐ ๋ค์ ๋ถ๋ถ ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋ณ๋์ ํ์ผ์ ์๋ ํด๋์ค์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ์ฌ ๋๊ตฌ(ํด๋์ค๋ฅผ ์๋ ์์ฑํ๋)๊ฐ ๋ฎ์ด์ฐ์ง ์๋๋ก ํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋ถ๋ถ ํด๋์ค์ ์ฌ์ฉ ์ฌ๋ก๋ ์์ฑ๋ ํ๋ก์ ํด๋์ค์ ๋๋ค. ์: WebAPI ๋๋ SignalR ๋ํผ. ์์ฑ๋ ํ๋ก์ ํด๋์ค๋ฅผ ์ฌ์ฉ์ ์ ์ ๋ก์ง์ผ๋ก ํ์ฅํ ์ ์๋ค๋ฉด ์ ๋ง ์ข์ ๊ฒ์ ๋๋ค. ํนํ ๋ชจ๋ธ์ ๋ํ ํด๋์ค๋ฅผ ์์ฑํ ๋ API์์ ๋ฐํ๋ ๋ชจ๋ธ ํด๋์ค์ ๋น์ฆ๋์ค ๋ก์ง์ ์ง์ ์ฐ๊ฒฐํ ์ ์์ผ๋ฉด ์ข์ ๊ฒ์ ๋๋ค.