Typescript(2)
๐์์ํ๋ฉฐ
์ด์ ํฌ์คํธ์์ ํ์ ์คํฌ๋ฆฝํธ์ ๊ธฐ๋ณธ์ ์ธ ๋ด์ฉ์ ์ดํด๋ดค๋ค๋ฉด, ์ด๋ฒ์ ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ํธํ๊ฒ ์ฌ์ฉํ๊ฒ ํด์ฃผ๋ ์ ๋ค๋ฆญ๊ณผ ์ ๋ค๋ฆญ ์ ํธ๋ฆฌํฐ ํ์ ์ ๋ํด ์์๋ณด๊ณ ์ ํ๋ค.๐
์ด ๊ธ์ ์๋์ ๊ฐ์ด ์ด์ด์ง๋๋ค.
โ ์ ๋ค๋ฆญ
โก๏ธ๊ธฐ์กด ์ฌ์ฉ ๋ฐฉ์
์ ๋ค๋ฆญ์ ์ฝ๋๋ฅผ ๋ ์ ์ฐํ๊ฒ ๋ง๋๋ ๊ธฐ๋ฅ์ ํ๋ค.
๊ธฐ์กด์ ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ ๋์ ๋ค๋ฅด๊ฒ ์ฒ์๋ถํฐ ๊ตฌ์ฒด์ ์ธ ํ์ ์ ์ง์ ํ๋ ๊ฒ์ด ์๋๋ผ ์ฌ์ฉ์์ ๋์ ์ผ๋ก ํ์ ์ ํ ๋นํ ์ ์๋ ๊ฒ์ด๋ค!
์๋ฅผ ๋ค์ด, ์๋์ ๊ฐ์ ์ฝ๋๊ฐ ์๋ค๊ณ ๊ฐ์ ํ์. ๊ทธ๋ผ, ๋งค๊ฐ๋ณ์๊ฐ number๊ณ , return ๊ฐ๋ number ์์ ์ ์ ์๋ค. ์ด๋ฏธ ์ฒ์๋ถํฐ ๊ทธ๋ ๊ฒ ์ค์ ํด ๋์๊ธฐ ๋๋ฌธ์ด๋ค.
1
2
3
function identity(arg: number): number {
return arg
}
๋ง์ฝ ๋งค๊ฐ๋ณ์์ ๊ฐ์ด ์ด๋ค ํ์
์ธ์ง ์ ์ ์๋ค๋ฉด ์ด๋ป๊ฒ ํ ๊น? any
๋ฅผ ์จ์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ๋ ๋ฐฉ๋ฒ๋ ์๋ค. ํ์ง๋ง ๋ฌธ์ ๋ return ๊ฐ๋ any
์ด๊ธฐ ๋๋ฌธ์ function identity(arg: any): any
๋ถ๋ถ๋ง ๋ณธ๋ค๋ฉด ์ด๋ค ํ์
์ ๊ฐ์ด ๋์ค๋์ง ์ ์ ์๋ค.
1
2
3
function identity(arg: any): any {
return arg
}
โก๏ธ์ ๋ค๋ฆญ ์ฌ์ฉํ๊ธฐ
๐์ ์ธ
์ด๋ด๋ ์ ๋ค๋ฆญ์ด ๋น์ ๋ฐํ๋ค!โจ ์์ ๋ฅผ ์ดํด๋ณด์! ๋จผ์ , ์๋ ์ฝ๋์์ <T>
๋ ์ ๋ค๋ฆญ ํ์
๋งค๊ฐ๋ณ์๋ฅผ ๋งํ๋ค. ๋ฌผ๋ก , ๋ค๋ฅธ ์ด๋ฆ์ ์ฌ์ฉํด๋ ๋๋ค. ex) <Type>
๋ฑ
๋จผ์ ํด๋น ์ฝ๋์์ ์ ๋ค๋ฆญ์ ์ฌ์ฉํ๊ฒ ๋ค๊ณ <T>
๋ฅผ ๋ถ์ฌ ์๋ ค์ค๋ค. ๊ทธ๋ค์ arg ๋งค๊ฐ๋ณ์์ ํด๋น ์ ๋ค๋ฆญ ํ์
์ ์ ์ธํ๊ณ , ๋ฐํ ๊ฐ๋ ๋์ผํ๊ฒ ์ ์ธํด์ฃผ์๋ค.
1
2
3
function identity<T>(arg: T): T {
return arg
}
๐ํธ์ถ
์ฌ์ฉํ ๋ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ๋ค. ํจ์๋ฅผ ํธ์ถํ๋ฉด์ <T>
์ ๋ค์ด๊ฐ ํ์
์ ๋ฃ์ด ์ ๋ฌํด์ฃผ๋ฉด ๋๋ค. ๋ฌผ๋ก , ์ด ๊ฒฝ์ฐ์๋ ํ์
์ถ๋ก ์ ์งํํ๋ฏ๋ก ๋ช
์์ ์ผ๋ก ์ ์ง ์์๋ ์๋ํ๋ค.
์๋ ์์ ๋ค์ ๋ชจ๋ ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์๋ ์ฝ๋๋ค.
๋งค๊ฐ๋ณ์ ํ์ ์ด ๋ค์ํ ํจ์๋ฅผ ๋ชจ๋ ์์ฑํ ํ์์์ด ํ๋์ ํจ์๋ฅผ ์ ์ธํ๊ณ , ์๋์ ๊ฐ์ด ํธ์ถํด์ฃผ๋ฉด ๋๋ ์ฝ๋๊ฐ ํจ์ฌ ๊น๋ํด์ง๋ค.
1
2
3
let result1: number = identity<number>(2)
let result2: string = identity<string>("Hi!")
let result3: number[] = identity<number[]>([1, 2, 3])
๋งค๊ฐ๋ณ์์ <T>
๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ์ง ์๊ณ , ์๋์ ๊ฐ์ด ์ฌ์ฉํ ์ ์๋ค.
1
2
3
4
function loggingIdentity<T>(arg: T[]): T[] {
console.log(arg.length) // arg๋ Tํ์
์ ๊ฐ์ง๊ณ ์๋ ๋ฐฐ์ด์ด๋ฏ๋ก,length๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ์ฆ, ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
return arg
}
โก๏ธ์ ๋ค๋ฆญ ์ ์ฝ์กฐ๊ฑด
์ ๋ค๋ฆญ์ ํตํด ์ ์ฐํ๊ฒ ์์ฑํ ์ ์๋ค๋ ์ฅ์ ์ด ์์ง๋ง, ์ ๋ค๋ฆญ์ ์ฌ์ฉํ๋ ํ์ ์ ์ขํ์ ์ฌ์ฉํ๊ณ ์ถ์ ์ ์๋ค. ์ด๋ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ์ฝ์กฐ๊ฑด ์ด๋ค.
๋จผ์ ์ฒซ๋ฒ์งธ User
ํ์
์ ๋ณด์. etc์๋ ์ด๋ค ํ์
์ด๋ ๋ค์ด์ฌ ์ ์๋ค.
1
2
3
4
interface User<T> {
name: string
etc: T
}
์ด๋ ์ etc์ string์ด๋ number๊ฐ๋ง ๋ค์ด์ค๊ฒ ์ ์ฝ์ ๊ฑธ์ด๋ณด์! ์ ์ฝ์ ๊ฑธ ๋๋ extends
ํค์๋๋ฅผ ์ฌ์ฉํด ์์ฑํ๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//์ ์ฝ์ ๊ฑด๋ค๋ฉด?
interface UserConstraints<T extends string | number> {
name: string
etc: T
}
//์ด๋ ๊ฒ ์์ฑ๋ ๊ฐ๋ฅ!
interface Weight {
weight: number
}
interface Height {
height: number
}
interface UserConstraints<T extends Weight | Height> {
name: string
etc: T // {weight: 70} ํน์ {height: 160} ์์ฑ์ ๊ฐ์ง ์ ์๋ค.
}
โ ์ ๋ค๋ฆญ ์ ํธ๋ฆฌํฐ ํ์
์ ๋ค๋ฆญ ์ ํธ๋ฆฌํฐํ์ ์ด๋ ํ์ ์คํฌ๋ฆฝํธ์์ ์ ๋ค๋ฆญ ํ์ ์ ์ ์ฐํ๊ฒ ๋ค๋ฃฐ ์ ์๋๋ก ๋ง๋ค์ด ์ค๋ค! ์์ฃผ ์ฌ์ฉํ๋ ๊ฒ ์์ฃผ๋ก ์ดํด๋ณด์๐
โก๏ธPartial<T>
์ ๋ค๋ฆญ ํ์ ์ ๋ชจ๋ ์์ฑ์ ์ ํ์ ์ผ๋ก ๋ง๋ ๋ค! ์๋ ์ฝ๋๋ User type์ด Partial์ ์ํด ๋ชจ๋ ์ ํ ์์ฑ์ด ๋์ด, ๋ชจ๋์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์๋๋ค!
1
2
3
4
5
6
7
8
interface User {
name: string
age: number
}
const shin: Partial<User> = { name: "jjang-gu" } โญ
const han: Partial<User> = { age: 5 } โญ
const lee: Partial<User> = {} โญ
โก๏ธPick<T>
์ผ๋ถ ์์ฑ๋ง ์ ํํด ์ ํ์ ์ ์์ฑํ๋ค! ์๋ ์์ ๋ฅผ ์ดํด๋ณด์. User type๊ณผ ๊ธฐ์กด์ User type์์ name๊ณผ age ์์ฑ๋ง ๋นผ์ UserInfo type์ ์๋ก ๋ง๋ค์๋ค. ์ฆ ์๋์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์์ธกํ ์ ์๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
interface User {
name: string
age: number
isMarried: boolean
}
type UserInfo = Pick<User, "name" | "age">
const shin:User = { โญ
name: "์ ์งฑ๊ตฌ",
age: 5,
isMarried: false
}
const shin:UserInfo = { โ
name: "์ ์งฑ๊ตฌ",
age: 5,
isMarried: false //Userinfo ํ์
์์๋ isMarried ์์ฑ์ด ์๋ค.
}
const shin:UserInfo = { โญ
name: "์ ์งฑ๊ตฌ",
age: 5
}
โก๏ธOmit<T, K>
Pick์ด ํ์ํ ๊ฒ๋ง ๋ฝ์์ ์ ์์ฑ์ ๋ง๋๋ ๊ฑฐ๋ผ๋ฉด, Omit์ ํน์ ์์ฑ์ ์ ์ธํ๊ณ ์๋ก์ด ์์ฑ์ ๋ง๋ ๋ค! ์์ ๋ฅผ ์ดํด๋ณด์!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
interface User {
name: string
age: number
isMarried: boolean
}
type WithoutAge = Omit<User, "age">
const shin:User = { โญ
name: "์ ์งฑ๊ตฌ",
age: 5,
isMarried: false
}
const shin:WithoutAge = { โ
name: "์ ์งฑ๊ตฌ",
age: 5, //WithoutAge ํ์
์์๋ age ์์ฑ์ ์ญ์ ํ๋ค!
isMarried: false
}
const shin:WithoutAge = { โญ
name: "์ ์งฑ๊ตฌ",
isMarried: false
}
โก๏ธRecord<K, T>
์ K, T๋ก ์์ฑํ ๊น? ํ๋๋ฐ K = key์ด๊ณ T = type์ด๋ผ ์ด๋ ๊ฒ ์์ฑํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ ๊ฒ ๊ฐ๋ค.
์๋ฅผ๋ค์ด record๋ฅผ ๋ง๋ค๋ key๊ฐ์ string, value ๊ฐ์ number๋ก ์ง์ ํ๊ณ ์ ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ง๋ค ์ ์๋ค!
1
2
3
4
5
6
7
type MyRecord = Record<string, number>
const myRecord: MyRecord = {
one: 1,
two: 2,
three: 3,
}
๋ง์ฝ key ๊ฐ์ ํ์คํ๊ฒ ์ง์ ํ๊ณ ์ถ๋ค๋ฉด ์๋์ ๊ฐ์ด ์์ฑํ ์ ์๋ค.
1
2
3
4
5
6
7
type MyKey = "์งฑ๊ตฌ" | "์ ๋ฆฌ" | "๋งน๊ตฌ"
const memberAge: Record<MyKey, number> = {
์งฑ๊ตฌ: 5,
์ ๋ฆฌ: 4,
๋งน๊ตฌ: 6,
}
โก๏ธReadonly<T>
Readonly๋ ์ ๋ค๋ฆญ ๋ชจ๋ ํ์ ์ ์ฝ๊ธฐ ์์ฑ์ผ๋ก ๋ง๋ ๋ค! ์ฝ๊ฒ ๋งํด ๋ณ์, ์์ฑ์ ์ฝ๊ธฐ์ ์ฉ์ผ๋ก ๋ง๋ค๊ณ ๋ณ๊ฒฝ์ ๋ง๋ ๊ฒ์ด๋ค.
1
2
3
4
5
6
7
8
9
10
interface User {
name: string
age: number
}
const user1:User = { name: "์งฑ๊ตฌ", age: 5 }
user1.age = 5 โญ//์ฌ ํ ๋น ๋ฌธ์ ์์
const user2:Readonly<User> = { name: "์งฑ๊ตฌ", age: 5 }
user2.age = 5 โ//์ฝ๊ธฐ ์ ์ฉ์ด๋ฏ๋ก ์ฌ ํ ๋น ์๋ฌ ๋ฐ์
๐ฉ๋ง๋ฌด๋ฆฌ
์ด๋ ๊ฒ ์ ๋ฆฌํ๊ณ ๋๋ ์ ๋ค๋ฆญ ์ฌ์ฉ๋ฒ์ ๋ ์ ์ดํดํ ์ ์์๋ค.๐ ์ด์ ํ๋ก์ ํธ ํ ๋ ์ข ๋ ํธํ๊ณ ๋ค์ํ ๋ฐฉ์์ผ๋ก ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ํ์ฉํด๋ณด์!