Post

Typescript(1)

๐Ÿ“Œ์‹œ์ž‘ํ•˜๋ฉฐ

Next.js + Typescript ์ธ๊ฐ•์„ ๋“ฃ๋˜ ์ค‘ ์„ ์ƒ๋‹˜๊ป˜์„œ

(์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜์‹œ๋ฉด์„œ) ์ด ๋ถ€๋ถ„์€ ์กฐ๊ธˆ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์–ด์š”.

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

์ด ๊ธ€์€ ์•„๋ž˜์™€ ๊ฐ™์ด ์ด์–ด์ง‘๋‹ˆ๋‹ค.

โœ…typescript ์‚ฌ์šฉํ•˜๊ธฐ

๋จผ์ € typescript๋ฅผ react๋‚˜ next์—์„œ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ?

  1. cra๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ
1
npx create-react-app [ํ”„๋กœ์ ํŠธ ๋ช…] --template typescript
  1. vite๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ
1
yarn create vite [ํ”„๋กœ์ ํŠธ ๋ช…] --template react-ts
  1. next๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ
1
npx create-next-app@latest

next.js๋Š” ์„ค์น˜ ๋‹น์‹œ์— typescript ์‚ฌ์šฉ์—ฌ๋ถ€๋ฅผ ๋ฌผ์–ด๋ณด๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๋‹ตํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

โœ…์›์‹œํƒ€์ž…

๊ธฐ๋ณธ์ ์ธ JS์˜ ์›์‹œํƒ€์ž…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํƒ€์ž…์„ ์ •์˜ํ•œ๋‹ค.

1
2
3
4
5
let name: string = "์งฑ๊ตฌ"
let age: number = 5
let isMarried: boolean = false
let isNull: null = null
let isUndefined: undefined = undefined

โœ…๋ฐฐ์—ด๊ณผ ๊ฐ์ฒด

๋ฐฐ์—ด ์ •์˜ ์‹œ ์œ„์—์„œ ์‚ดํŽด๋ณธ ํƒ€์ž…๊ณผ ํ•จ๊ป˜ [] ๊ธฐํ˜ธ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ๋ฉด ๋œ๋‹ค. ํ•ด๋‹น ํƒ€์ž…์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฐฐ์—ด์ž„์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

1
2
let name: string[] = ["์งฑ๊ตฌ", "์œ ๋ฆฌ", " ๋งน๊ตฌ"]
let age: number[] = [5, 4, 6]

๋งŒ์•ฝ ๋ฐฐ์—ด์•ˆ์˜ ํƒ€์ž…์ด ์—ฌ๋Ÿฌ๊ฐœ๋ผ๋ฉด (ํƒ€์ž…1|ํƒ€์ž…2)[]๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•œ๋‹ค.

1
let group: (string | number | boolean)[] = ["์งฑ๊ตฌ", "์œ ๋ฆฌ", 5, " ๋งน๊ตฌ", false]

โœ…ํ•จ์ˆ˜

ํ•จ์ˆ˜์—์„œ ์ง€์ •ํ•ด์ฃผ์–ด์•ผ ํ•˜๋Š” ํƒ€์ž…์€ ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ํƒ€์ž…๊ณผ, ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ’์˜ ํƒ€์ž…์ด๋‹ค.

โžก๏ธ๋ฐ˜ํ™˜ ๊ฐ’์ด ์žˆ์„ ๋•Œ

๋ฐ˜ํ™˜๊ฐ’(return ๊ฐ’)์ด ์žˆ์„ ๊ฒฝ์šฐ return ํ•˜๋Š” ๊ฐ’์˜ type์„ ์ž‘์„ฑํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

1
2
3
function hello(a: number, b: number): number {
  return a + b
}

โžก๏ธ๋ฐ˜ํ™˜ ๊ฐ’์ด ์—†์„ ๋•Œ

๋ฐ˜ํ™˜๊ฐ’(return ๊ฐ’)์ด ์—†๋Š” ๊ฒฝ์šฐ type์€ void๋กœ ์ž‘์„ฑํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

1
2
3
function hello(name: string, age: number): void {
  console.log("๋‚ด ์ด๋ฆ„์€" + name + "๋‚˜์ด๋Š”" + age + "์ž…๋‹ˆ๋‹ค")
}

โœ…Type Aliases

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

1
2
3
4
type User = { name: string; age: number }

let shin: User = { name: "์งฑ๊ตฌ", age: 5 }
let han: User = { name: "์œ ๋ฆฌ", age: 5 }

โžก๏ธ | (union)

(union)์„ ์ด์šฉํ•ด ์—ฌ๋Ÿฌ ํƒ€์ž… ์ค‘ ํ•œ ๊ฐ€์ง€๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์ œ์—์„œ User๋Š” string, number ๊ฐ’ ์ค‘ ํ•˜๋‚˜๋ฅผ ๊ฐ€์ง„๋‹ค๋Š” ๋œป์ด๋ฉฐ, Obj ๋Š” name: string์ธ ๊ฐ์ฒด์ด๊ฑฐ๋‚˜ age:number ๊ฐ’์„ ๊ฐ€์ง€๋Š” ๊ฐ์ฒด๋ผ๋Š” ๋œป์ด๋‹ค.
1
2
3
4
5
6
7
8
9
10
11
type User = string | number
type Obj = { name: string } | { age: number }

let user1:User = "์งฑ๊ตฌ"โญ• //string ๊ฐ’ ๊ฐ€๋Šฅ
let user2:User = 5โญ• //number ๊ฐ’ ๊ฐ€๋Šฅ
let user3:User = falseโŒ //boolean ๊ฐ’ ๋ถˆ๊ฐ€๋Šฅ

let user4:Obj = { name: "์งฑ๊ตฌ" }โญ•
let user5:Obj = { age: 5 }โญ•
let user6:Obj = { isMarried: false }โŒ
//isMarried๊ฐ€ key ๊ฐ’์ธ ๊ฐ์ฒด ํƒ€์ž…์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์Œ. ๋ถˆ๊ฐ€๋Šฅ

โžก๏ธ & (intersection)

& (intersection)์„ ์ด์šฉํ•ด ์—ฌ๋Ÿฌ ํƒ€์ž…์„ ๊ฐ€์ง€๋Š” ์ƒˆ๋กœ์šด ํƒ€์ž…์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
type Name = { name: string }
type Age = { age: number }
type User = Name & Age

let user1: User = {โญ•
  name: "์งฑ๊ตฌ",
  age: 5,
}
let user2: User = {โŒ //age ๋ˆ„๋ฝ
  name: "์งฑ๊ตฌ",
}
let user3: User = {โŒ//name ๋ˆ„๋ฝ
  age: 5,
}

โœ…interface

interface๋Š” ์ฃผ๋กœ ๊ฐ์ฒด์˜ ํƒ€์ž…์„ ์ง€์ •ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. type ํ‚ค์›Œ๋“œ๋ฅผ ์“ธ ๋•Œ์™€ ์ฐจ์ด์ ์€ = ์—†์ด ๋ฐ”๋กœ {} ์•ˆ์— ํƒ€์ž…์„ ์ž‘์„ฑํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค!

1
2
3
4
5
6
7
8
9
10
11
12
interface User {
  name: string
  age: number
  isMarried: boolean
}

//์‚ฌ์šฉ์‹œ
const shin: User = {
  name: "์งฑ๊ตฌ",
  age: 5,
  isMarried: false,
}

โžก๏ธinterface extends

interface๋Š” extends ๊ตฌ๋ฌธ์„ ์ด์šฉํ•ด ๊ธฐ์กด์— ์ •์˜๋œ ํƒ€์ž…์„ ์ƒ์†๋ฐ›๊ณ , ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
interface Name {
  name: string
}

interface User extends Name { ๐Ÿ‘ˆ
  age: number
  isMarried: boolean
}

let shin: User = {
  name: "์งฑ๊ตฌ",
  age: 5,
  isMarried: false,
}

โžก๏ธ? (optional)

? (optional) ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์„ ํƒ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์†์„ฑ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์—ฌ๋Ÿฌ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š”๋ฐ ๊ฐ๊ฐ์˜ ๊ฐ์ฒด์— name, age๋ฅผ ๋ชจ๋‘ ๊ฐ€์ง€๊ณ  ์žˆ๊ฑฐ๋‚˜ ํ•œ ๊ฐ€์ง€๋งŒ ๊ฐ€์ง„๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž.

name,age๋ฅผ ๋ชจ๋‘๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํƒ€์ž…, name ํƒ€์ž…, age ํƒ€์ž…์„ ํ•˜๋‚˜์”ฉ ์ง€์ •ํ•˜๊ธฐ์—” ๋„ˆ๋ฌด ๋ฒˆ๊ฑฐ๋กญ๋‹ค.๐Ÿค” ์ด๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ธ ๊ฒƒ์ด๋‹ค.

1
2
3
4
5
6
7
8
interface User {
  name: string
  age?: number๐Ÿ‘ˆ // age๋Š” ์„ ํƒ ์†์„ฑ์ด๋‹ค!
}

let shin: User = { name: "์งฑ๊ตฌ" }โญ•
let han: User = { name: "์œ ๋ฆฌ", age: 5 }โญ•
let lee: User = { age: 5 }โŒ //name์€ ํ•„์ˆ˜๋‹ค.

โœ…Enum

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

1
2
3
4
5
6
7
enum User {
  JjangGu,
  Yuri,
}

let member: User = User.JJangGuโญ•
let member: User = User.Yuriโญ•

์ฆ‰ ์•„๋ž˜์˜ ๊ฒฝ์šฐ, Hun์€ enum ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•œ ์ง‘ํ•ฉ์— ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฏ€๋กœ, ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

1
let member: User = User.HunโŒ

โœ…ํƒ€์ž… ๋ฐฉ์–ด

โœ…ํƒ€์ž… ๋‹จ์–ธ

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

ํƒ€์ž… ๋‹จ์–ด๋Š” as๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์•„๋ž˜์™€ ๊ฐ™์ด getElementById๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ’์„ ๋ถˆ๋Ÿฌ์˜จ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” getElementById๋กœ ๋ถˆ๋Ÿฌ์˜ฌ ๊ฒฝ์šฐ ํƒ€์ž…์„ HTMLElement | null๋กœ ์ถ”๋ก ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๊ฐœ๋ฐœ์ž๋Š” ํ•ด๋‹น ๊ฐ์ฒด์˜ ํƒ€์ž…์ด HTMLCanvasElement์ž„์„ ์•Œ๊ณ  ์žˆ๋‹ค.

1
const myCanvas = document.getElementById("main_canvas")

์ด ๊ฒฝ์šฐ asํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ ํƒ€์ž… ๋‹จ์–ธ์œผ๋กœ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—๊ฒŒ ๋ช…์‹œ์ ์œผ๋กœ ํƒ€์ž…์„ ์ •ํ•ด์ค„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

1
const myCanvas = document.getElementById("main_canvas") as HTMLCanvasElement

โœ…! (non-Null Assertion)

! (non-Null Assertion)์€ ์˜๋ฏธ ๊ทธ๋Œ€๋กœ, null์ด ์•„๋‹˜์„ ๋‹จ์–ธ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. typescript์—์„œ ์ปดํŒŒ์ผ ์˜ต์…˜์ธ strictNullChecks๋ฅผ ์ผœ๋ฉด ๊ฐ’์ด null์ด๊ฑฐ๋‚˜ ์ •์˜๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ, ํ•ด๋‹น ๊ฐ’์— ๋ฉ”์„œ๋“œ๋‚˜ ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ํ•ด๋‹น ๊ฐ’์„ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•œ๋‹ค.

์•„๋ž˜ ์˜ˆ์ œ์—์„œ x๋Š” optional๋กœ ์„ค์ •๋˜์—ˆ๋‹ค. ์ฆ‰, x์˜ ํƒ€์ž…์€ number ๋˜๋Š” null์ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

1
2
3
4
function liveDangerously(x?: number | null) {
  // ์•„๋ž˜์—์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.
  console.log(x!.toFixed())
}

๋”ฐ๋ผ์„œ, console.log(x.toFixed())๋ฅผ ์‹œ๋„ํ•˜๋ฉด, typescript๋Š”

x๊ฐ€ null์ผ์ˆ˜๋„ ์žˆ๊ฒ ๋Š”๋ฐ?

๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉฐ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฐœ๋ฐœ์ž ์ž…์žฅ์—์„œ, x๊ฐ€ null์ด ์•„๋‹˜์„ ํ™•์‹ ํ•œ๋‹ค๋ฉด, ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ x!.toFixed()์ฒ˜๋Ÿผ x๊ฐ€ null์ผ ๊ฐ€๋Šฅ์„ฑ์ด ์—†๋‹ค๊ณ  ๋‹จ์–ธํ•ด์ค„ ์ˆ˜ ์žˆ๊ณ , ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ฒŒ ๋œ๋‹ค.

โœ…d.ts

d.ts ํŒŒ์ผ์€ โ€˜์„ ์–ธ ํŒŒ์ผ(Declaration file)โ€™ ์ด๋ผ๊ณ  ํ•œ๋‹ค. ์ตœ๊ทผ์— ๋“ฑ์žฅํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” typescript๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก Type์„ ์ œ๊ณตํ•˜์ง€๋งŒ, ์˜ค๋ž˜ ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ๋Š” ์ œ๊ณตํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค.๐Ÿค”

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์œ„ํ•ด, d.ts ํŒŒ์ผ์„ ์ด์šฉํ•ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํƒ€์ž… ์ •๋ณด๋ฅผ ์ง€์ •ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

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

์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ํƒ€์ž…๋“ค์„, ์ด๋ ‡๊ฒŒ ์ •๋ฆฌํ•˜๋ฉด์„œ ํ•œ ๋ฒˆ ๋” ์ดํ•ดํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค!

์ œ๋„ค๋ฆญ๊ณผ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํƒ€์ž…์ด ๋‚จ์•˜๋Š”๋ฐ, ๊ธ€์ด ๊ธธ์–ด์งˆ ๊ฒƒ ๊ฐ™์•„์„œ ๋‹ค์Œ ํฌ์ŠคํŠธ์—์„œ ์ด์–ด์„œ ์ •๋ฆฌํ•˜๊ณ ์ž ํ•œ๋‹ค.๐Ÿ˜Ž

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

-https://www.typescriptlang.org/ko/docs/handbook/declaration-files/dts-from-js.html

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