ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๋ก ์ทจ์ ์ ์ค๋นํ๋ฉด์ TypeScript์ ๋ํ ์ดํด๋ฅผ ์ ๋ฆฌํ๊ณ ์, ์ค์ ๋ฉด์ ์์ ์์ฃผ ๋์ค๋ TypeScript ํต์ฌ ๊ฐ๋ ๋ค์ ์ ๋ฆฌํด๋ณด๊ฒ ์ต๋๋ค.
Union ํ์
(|)์ ์ฌ๋ฌ ํ์
์ค ํ๋๊ฐ ๋ ์ ์์์ ์๋ฏธํฉ๋๋ค.
์ฆ, ๋๋(OR)์ ๊ฐ๋
์ผ๋ก ํ์
๊ฐ๋ฅ์ฑ์ ํ์ฅํฉ๋๋ค.
Intersection ํ์
(&)์ ์ฌ๋ฌ ํ์
์ ๋ชจ๋ ๋ง์กฑํ๋ ํ์
์ ์๋ฏธํฉ๋๋ค. ์ฆ, ๊ทธ๋ฆฌ๊ณ (AND)์ ๊ฐ๋
์ผ๋ก ํ์
๊ฐ๋ฅ์ฑ์ผ ์ถ์ํฉ๋๋ค.
type A = { a: string }
type X = { x: number }
// Union: A ๋๋ X ํ์
(ํ์ฅ)
type AorX = A | X
const a: AorX = { a: 'hello' } // A ํ์
๋ง ๋ง์กฑ
const b: AorX = { x: 12 } // X ํ์
๋ง ๋ง์กฑ
// Intersection: A ๊ทธ๋ฆฌ๊ณ X ํ์
์ ๋ชจ๋ ๋ง์กฑ (์ถ์)
type AandX = A & X
const c: AandX = { a: 'hi', x: 12 } // A์ X ๋ชจ๋ ๋ง์กฑํด์ผ ํจ
๐ก ํฌ์ธํธ: ์ถ์/ํ์ฅ์ ์ข๊ณ ๋์จ์ ๊ฐ๋ ์ด ์๋๋๋ค. ์ํฉ์ ๋ง๊ฒ ์ ์ ํ ์ฌ์ฉํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
extendsํค์๋๋ก ํ์ฅ ๊ฐ๋ฅ// Interface - ์ ์ธ ๋ณํฉ ๊ฐ๋ฅ
interface User {
name: string
}
interface User {
age: number
}
// ์๋์ผ๋ก ๋ณํฉ๋จ: { name: string, age: number }
// Interface - ํ์ฅ
interface Admin extends User {
role: string
}
// Type Alias - ๋ค์ํ ํ์
์ ์
type Status = 'loading' | 'success' | 'error'
// Interface์ extends์ ๊ฐ์ด ์ฌ์ฉํ๋ ค๋ฉด ์๋์ ๊ฐ์ด ์ฌ์ฉ๊ฐ๋ฅํจ
type UserWithStatus = User & { status: Status }
๋ฐํ์์์ ๋ณ์์ ํ์ ์ ๊ฒ์ฌํ๊ณ , ํด๋น ํ์ ์ ๋ฐ๋ผ ์์ ํ ์ฝ๋ ๋ธ๋ก์ ๋ง๋๋ ๊ธฐ๋ฒ์ ๋๋ค.
typeof ์ฐ์ฐ์instanceof ์ฐ์ฐ์in ์ฐ์ฐ์is ํค์๋๋ฅผ ์ฌ์ฉํ ์ฌ์ฉ์ ์ ์ ํ์
๊ฐ๋const el = document.querySelect('button')
// ๋ฌธ์ ๋ฐ์ ์ฝ๋
// button์ด๋ผ๋ ๋
ธ๋๋ฅผ ์ฐพ์ง ๋ชปํ๋ฉด Null์ด ๋ฐ์ํ๊ฒ ๋จ
// ์๋ ๋ถ๋ถ์์ Error๊ฐ ๋ฐ์ํ ์ฐ๋ ค๊ฐ ์๊ธฐ๊ฒ ๋๋ค.
el.addEventListner();
์ต์
๋ ์ฒด์ด๋์ ์ฌ์ฉํ์ฌ el?.addEventListner()์ ๊ฐ์ด ์ฌ์ฉํ ์๋ ์์ง๋ง ๋งค๋ฒ el์ ์ฌ์ฉํ ๋ ์ต์
๋ ์ฒด์ด๋์ ๋ถ์ฌ์ค์ผํ๋ ๋ฒ๊ฑฐ๋ก์์ด ์กด์ฌํ๊ฒ ๋ฉ๋๋ค. ์ด๋ ์ฌ๋ฌ ํ์
๊ฐ๋ ๋ฐฉ๋ฒ๋ค์ ์ฌ์ฉํด ๋ณผ ์ ์์ต๋๋ค.
// 1. ๊ธฐ๋ณธ ํ์
if(el){
el.addEventListner('click', () => {})
}
// 2. instanceof ์ฌ์ฉ
if(el instanceof HTMLButtonElement){
el.click();
}
// 3. in ์ฐ์ฐ์ ์ฌ์ฉ
if(el && 'classList' in el){
el.classList.add('active');
}
// 4. ์ฌ์ฉ์ ์ ์ ํ์
๊ฐ๋
// is : ์ด ํจ์๊ฐ true๋ฅผ ๋ฐํํ ๊ฒฝ์ฐ ํ์
์คํฌ๋ฆฝํธํํ
์ด ํ์
์ด๋ผ๊ณ ๋ด๋ ๋จ ์ด๋ผ๊ณ ํ์ ์ ์ฃผ๊ฒ ๋ง๋๋๊ฒ.
function isHTMLElement(el: Element | null): el is HTMLElement{
return el instanceof HTMLElemnt
}
if(isHTMLElement(el)){
el.style.color = 'red'
}
๊ฐ๋ฐ์๊ฐ TypeScript๋ณด๋ค ํ์ ์ ๋ ์ ํํ ์๊ณ ์์ ๋, ๋ช ์์ ์ผ๋ก ํ์ ์ ๊ฐ์ ํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
asํค์๋ ์ฌ์ฉ! Non-null ๋จ์ธ ์ฐ์ฐ์satisfies ํค์๋๋ก ํ์
์์ ์ฑ ํ๋ณดconst body = document.querySelector('body');
// body๋ ํญ์ ์กด์ฌํ๋ฏ๋ก ์์ ํ๊ฒ ๋จ์ธ ๊ฐ๋ฅ
(body as HTMLElemnt).classList.add('on');
// Non-null(!) ๋จ์ธ ์ฐ์ฐ์
// ๋ณ์๊ฐ 'null'์ด๋ 'undefined'๊ฐ ์๋์ ๋จ์ธํ ์๋ ์์ต๋๋ค.
body!.classList.add('on');
์ด๋ ๊ฐ๋ฐ์๊ฐ ์ง์ ํ์
์ ๊ฐ์ ํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, ํ์
์์ ์ฑ์ ํด์น ์ ์์ผ๋ฏ๋ก ์ ์คํ๊ฒ ์ฌ์ฉํ๋ ๊ฒ์ด ํ์ํฉ๋๋ค. ๊ทธ๋์ ํ์
๋จ์ธ ๋์ ํ์
๊ฐ๋๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ satisfies ํค์๋์ ํ์
๋ง์กฑ์ ๊ฐ์ด ์ฌ์ฉํด ํ์
์์ ์ฑ์ ํ๋ณดํ๋ ์ ๊ทผ ๋ฐฉ๋ฒ๋ ์์ต๋๋ค.
๊ฐ๋ฐ์์ ์์ ์์ ์ด ํ์
์ ๋จ์ธํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ค์๊ฐ ๋ฐ์ํ ์ ์๊ณ ์๋ชป๋ ํ์
์ผ๋ก ๋์ด์ฌ ์ ์๊ธฐ ๋๋ฌธ์ ์ ์คํ๊ฒ ์ฌ์ฉํ ํ์๊ฐ ์๊ฒ ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด์..
interface X{
x: string
y: number
}
const a = {
b:{
x: 'hi'
} as X
}
ํด๋น ์ฝ๋๋ y๊ฐ ์๋๋ฐ๋ ๋ถ๊ตฌํ๊ณ ์๋ฌํ์๋ฅผ ํ๊ณ ์์ง ์์ต๋๋ค. ์๋๋ฉด ํ์
๋จ์ธ์ ํ์๊ธฐ์ ๋ฐ์ํ์ง ์๋ ๊ฒ์ด์ฃ
์ด๋ฅผ ๋ฐฉ์งํ๊ณ ์ satisfies ํค์๋๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋ฉ๋๋ค.
satisfies๋ ํ์
์ ๋ง์กฑํ๋์ง ํ์ธํ๋ ํค์๋์
๋๋ค.
// satisfies๋ก ์์ ์ฑ ํ๋ณด
interface Config{
apiUrl: string
timeout: number
}
const config = {
apiUrl: 'https://api.example.com',
timeout: 5000
} satisfies Config as Config
ํค์ ๊ฐ์ ํ์ ์ ์ง์ ํด ๊ฐ์ฒด ํ์ ์ ์ ์ํ๋ TypeScript ๋ด์ฅ ์ ํธ๋ฆฌํฐ์ ๋๋ค.
interface A {
a:number
b:number
c:number
// ...
}
const a:A = {
a:1,
b:2,
c:3,
// ...
}
๋ง์ฝ ์ฌ์ฉํ๋ ค๊ณ ํ๋ ๊ฐ์ฒด ํ์ ๋ค์ด ๋ชจ๋ ๋์ผํ ๊ฒฝ์ฐ ์ผ์ผํ ๊ฐ์ ํ์ ๋ค์ ํ๋ํ๋ ๋ค ๋ช ์๋ฅผ ํด์ค์ผ ํ๋ ๋ถํธํจ์ด ๋ฐ์ํฉ๋๋ค.
let p = 'a'
a[p] // Error!
๋ํ ์์ ๊ฐ์ด ์ฌ์ฉํ๋ ค ํ ๊ฒฝ์ฐ์๋ ์๋ฌ๊ฐ ๋ฐ์ํ๊ฒ ๋๋๋ฐ
let์ ์ธ์ ๋ ๋ค์ ๊ฐ์ด ์ฌ ํ ๋น ๋ ์ ์๋ ๋ณ์์ด๊ธฐ ๋๋ฌธ์ ์๋ฌ๊ฐ ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ํค ๊ฐ์ด 'a'๋ผ๊ณ ํ์ ํ ์๊ฐ ์๊ฒ ๋๋ ๊ฒ์ด์ฃ .
์ด๋ ์ฌ์ฉํ๋๊ฒ์ด ์ธ๋ฑ์ฑ ๊ธฐ๋ฅ ํ์
์ ์ถ๊ฐํ๋ฉด ๋ฉ๋๋ค.
interface A{
[key:string] : number
// ...
}
a[p] = 9; // ๊ฐ ํ ๋น๋ ๊ฐ๋ฅํจ
๊ทธ๋ฆฌ๊ณ record ์ ํธ๋ฆฌํฐ๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด ํด๋น ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ง ์์๋ ๋๊ฒ ๋ฉ๋๋ค.
const a = Record<string, number> = {...}
๋์ ์ผ๋ก ๋ณ๊ฒฝํ๊ธฐ๊ฐ ์ฝ์ง๋ง, ์์ฑ์ด ์์ฃผ ๋ง๊ฑฐ๋ ์ ํํ๊ฒ ์ด๋ ํ ์์ฑ์ด ๋ค์ด๊ฐ์ผ ๋๋ค๊ณ ํ๋ค๋ฉด Record์ ํธ๋ฆฌํฐ๋ ์ ํฉํ์ง ์๊ณ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ํฉํ๋ค.
Q1) TypeScript ์ ๋์ธ๊ณผ ์ธํฐ์น์ ํ์ ์ ์ฐจ์ด์ ์ ์ค๋ช ํด์ฃผ์ธ์
A) ํ์
์คํฌ๋ฆฝํธ์์ ์ ๋์ธ ํ์
์ '|(vertical bar)'๊ธฐํธ๋ฅผ ํตํด์ ์ฌ๋ฌ ํ์
์ค ํ๋๊ฐ ๋ ์ ์๋ค๋ ๊ฒ์ ์ ์ํ๋ฉฐ, ๋๋(or)๊ณผ ๋น์ทํ ์๋ฏธ์
๋๋ค. ๋ฐ๋๋ก ์ธํฐ์น์
ํ์
์ '&(Intersection)'๊ธฐํธ๋ก ์ฌ๋ฌ ํ์
์ ๋ชจ๋ ๋ง์กฑํ๋ ํ์
์ ์ ์ํ๋ฉฐ, ๊ทธ๋ฆฌ๊ณ (and)์ ๋น์ทํ ์๋ฏธ์
๋๋ค.
๊ทธ๋์ ์ ๋์ธ ํ์
๊ฐ๋ฅ์ฑ์ ํ์ฅํ๊ณ ์ธํฐ์น์
ํ์
์ ํ์
๊ฐ๋ฅ์ฑ์ ์ถ์ํ๋ ์ญํ ์ ํ๋ค๊ณ ๋งํ ์ ์์ต๋๋ค.
Q2) ์ธํฐํ์ด์ค์ ํ์ ๋ณ์นญ์ ์ฐจ์ด์ ์ ์ค๋ช ํด์ฃผ์ธ์.
A) ์ธํฐํ์ด์ค์ ํ์
๋ณ์นญ์ ๋ชจ๋ ํ์
์คํฌ๋ฆฝํธ์ ํ์
์ ์ ์ํ๋๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ฐ์ ์ธํฐํ์ด์ค๋ ์ฃผ๋ก ๊ฐ์ฒด ํ์
์ ์ ์ํ ๋ ์ฌ์ฉํ๋๋ฐ, ๊ฐ์ ์ด๋ฆ์ ์ธํฐํ์ด์ค๋ฅผ ์ฌ๋ฌ๋ฒ ์ ์ธํ๋ฉด ์๋์ผ๋ก ๋ณํฉ๋๊ณ ์ด๋ฅผ ์ ์ธ ๋ณํฉ์ด๋ผ๊ณ ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ธํฐํ์ด์ค๋ extends ํค์๋๋ฅผ ์ฌ์ฉํด ํ์
์ ํ์ฅํ ์๋ ์์ต๋๋ค.
๋ฐ๋ฉด ํ์
๋ณ์นญ์ ๊ฐ์ฒด๋ฟ๋ง ์๋๋ผ ์ ๋์ธ๊ณผ ์ธํฐ์น์
, ์ ๋ค๋ฆญ๋ฑ ๋ค์ํ ํ์
์ ์๋กญ๊ฒ ์ ์ํ ์ ์์ต๋๋ค.
๋์ ์ธํฐํ์ด์ค์ฒ๋ผ ํ์ฅํ ์ ์๊ณ , ๊ฐ์ ์ด๋ฆ์ ๋ฐ๋ณต ์ ์ธํ ์ ์์ต๋๋ค.
๊ทธ๋์ ํ์ฅ์ฑ์ ๊ณ ๋ คํ ๊ฐ์ฒด ํ์
์ ์ฃผ๋ก ์ธํฐํ์ด์ค๋ก ์ ์ํ๊ณ , ์ ์ ์ด์ง๋ง ์๋ก์ด ํ์
์ ์๋ ํ์
๋ณ์นญ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
Q3) TypeScript ํ์ ๊ฐ๋(Type Guard)์ ๋ํด ์ค๋ช ํด ์ฃผ์ธ์.
A) ํ์
๊ฐ๋๋ ๋ฐํ์์์ ๋ณ์์ ํ์
์ ๊ฒ์ฌํ๊ณ , ํด๋น ํ์
์ ๋ฐ๋ผ ๋ค๋ฅธ ๋์์ ์ํํ๋๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋งํฉ๋๋ค. ์ฃผ๋ก typeof, instanceof, in ์ฐ์ฐ์๋ก ์ง์ ๋ฐ์ดํฐ์ ํ์
์ ๊ฒ์ฌํ๊ฑฐ๋, is ํค์๋๋ฅผ ์ฌ์ฉํ๋ ๋ณ๋์ ํ์
๊ฐ๋ ํจ์๋ฅผ ์ ๊ณตํ ์๋ ์์ต๋๋ค.
Q4) TypeScript ํ์ ๋จ์ธ(Assertion)์ ๋ํด ์ค๋ช ํด ์ฃผ์ธ์.
A) ํ์
๋จ์ธ์ ์ ํํ ํ์
์ถ๋ก ์ด ์ด๋ ค์ด ๊ฒฝ์ฐ, ํน์ ๊ฐ์ ํ์
์ ๊ฐ๋ฐ์๊ฐ ๋ช
์์ ์ผ๋ก ๊ฐ์ ํ๋ ๋ฐฉ๋ฒ์ ๋งํฉ๋๋ค. ์ฃผ๋ก asํค์๋๋ฅผ ์ฌ์ฉํด ํ์
์ ๋จ์ธํ๊ณ !(Non-null)๋จ์ธ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด ๋ณ์๊ฐ null์ด๋ undefined๊ฐ ์๋์ ๋จ์ธํ ์๋ ์์ต๋๋ค.
์ด๋ ๊ฐ๋ฐ์๊ฐ ์ง์ ํ์
์ ๊ฐ์ ํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, ํ์
์์ ์ฑ์ ํด์น ์ ์์ผ๋ฏ๋ก ์ ์คํ๊ฒ ์ฌ์ฉํ๋ ๊ฒ์ด ํ์ํฉ๋๋ค. ๊ทธ๋์ ํ์
๋จ์ธ ๋์ ํ์
๊ฐ๋๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ satisfiesํค์๋์ ํ์
๋ง์กฑ์ ๊ฐ์ด ์ฌ์ฉํด ํ์
์์ ์ฑ์ ํ๋ณดํ๋ ์ ๊ทผ ๋ฐฉ๋ฒ๋ ์์ต๋๋ค.
Q5) TypeScript Record ์ ํธ๋ฆฌํฐ ํ์ ์ ๊ธฐ๋ฅ๊ณผ ๋ํ์ ์ธ ์ฌ์ฉ๋ฒ์ ์ค๋ช ํด ์ฃผ์ธ์.
A) Record ์ ํธ๋ฆฌํฐ ํ์
์ ํค์ ๊ฐ์ ํ์
์ ์์๋๋ก ์ ๊ณตํด ๊ฐ์ฒด ํ์
์ ์ ์ํ ์ ์๋ ํ์
์คํฌ๋ฆฝํธ ์ฌ์ด ๊ธฐ๋ฅ์
๋๋ค. ์ฃผ๋ก ์ ํด์ง์ง ์์ ์ด๋ฆ์ ์์ฑ๋ค์ด ๋ชจ๋ ๊ฐ์ ํ์
์ ๊ฐ์ ๊ฐ์ง ๋ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ง์ฝ ์ธํฐํ์ด์ค๋ก ๊ฐ์ฒด ํ์
์ ์ง์ ํ๋ฉด ์์ฑ์ ์ ์ ์ผ๋ก ์ ์ํ๊ธฐ๋๋ฌธ์, ์์ฑ์ด ์์ฃผ ๋ง๊ฑฐ๋ ๋์ ์ผ๋ก ์์ฑ์ด ์ถ๊ฐ๋๋ฉด ํ์
์ ์๋ ์ฌ์ฉ์ด ์ด๋ ค์์ง๋๋ค.
๊ทธ๋์ Record ์ ํธํฐ๋ฆฌ ํ์
์ ์ฌ์ฉํ๋ฉด, ๋์ ์ผ๋ก ์์ฑ์ ์ถ๊ฐํ๊ฑฐ๋ ๋ณ๊ฒฝํ๊ธฐ ์ฝ๊ณ ํนํ ๋๊ดํธ ํ๊ธฐ๋ฒ์ ์ฌ์ฉํด ๋์ ์ผ๋ก ์์ฑ์ ์กฐํํ๋ ๊ฒ๋ ๊ฐํธํฉ๋๋ค.
TypeScript์ ํต์ฌ ๊ฐ๋ ๋ค์ ์ดํดํ๊ณ ์ ์ ํ ํ์ฉํ๋ฉด ๋ ์์ ํ๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ด ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ๋ฉด์ ์์๋ ๋จ์ํ ๋ฌธ๋ฒ์ ์๊ธฐํ์ฌ ๊ธฐ๊ณ์ ์ผ๋ก ๋๋ตํ๋ ๊ฒ๋ณด๋ค. ์ธ์ , ์ ์ฌ์ฉํ๋์ง์ ์ด์ ์ ๋์ด ์ค๋ช ํ ์ ์๋๊ฒ์ด ์ค์ํฉ๋๋ค.
์ค์ ํ๋ก์ ํธ์ ์ ์ฉํด๋ณด๋ฉฐ ์ด๋ฐ ๊ฐ๋ ๋ค์ ํ์ฉํด๋ณด๋ฉด์ ๊ฒฝํ์ ์์๋ณด์ธ์