Post

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 โŒ//์ฝ๊ธฐ ์ „์šฉ์ด๋ฏ€๋กœ ์žฌ ํ• ๋‹น ์—๋Ÿฌ ๋ฐœ์ƒ

๐Ÿ“ฉ๋งˆ๋ฌด๋ฆฌ

์ด๋ ‡๊ฒŒ ์ •๋ฆฌํ•˜๊ณ  ๋‚˜๋‹ˆ ์ œ๋„ค๋ฆญ ์‚ฌ์šฉ๋ฒ•์„ ๋” ์ž˜ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.๐Ÿ˜Ž ์ด์ œ ํ”„๋กœ์ ํŠธ ํ•  ๋•Œ ์ข€ ๋” ํŽธํ•˜๊ณ  ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ™œ์šฉํ•ด๋ณด์ž!

๐Ÿ—‚๏ธ์ฐธ๊ณ  ์‚ฌ์ดํŠธ

This post is licensed under CC BY 4.0 by the author.