λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ“š μ±…

[λͺ¨λ˜λ¦¬μ•‘트λ”₯λ‹€μ΄λΈŒ] 1.7 선택이 μ•„λ‹Œ ν•„μˆ˜, νƒ€μž…μŠ€ν¬λ¦½νŠΈ

by megan07 2024. 3. 10.

1.7 선택이 μ•„λ‹Œ ν•„μˆ˜, νƒ€μž…μŠ€ν¬λ¦½νŠΈ

νƒ€μž…μŠ€ν¬λ¦½νŠΈλž€?

TypeScript is JavaScript with syntax for types.
(= μžλ°”μŠ€ν¬λ¦½νŠΈ 문법에 νƒ€μž…μ„ μΆ”κ°€ν•œ 것)

μ™œ μ‚¬μš©ν•˜λŠ”κ°€?

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 동적 νƒ€μž… 언어이기 λ•Œλ¬Έμ— μ½”λ“œλ₯Ό μ‹€ν–‰ν–ˆμ„ λ•Œλ§Œ μ—λŸ¬λ₯Ό 확인 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
ν•˜μ§€λ§Œ νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” λΉŒλ“œ νƒ€μž„μ— νƒ€μž… μ—λŸ¬λ₯Ό 확인 ν•  수 있기 λ•Œλ¬Έμ— μ—λŸ¬λ₯Ό 미리 찾을 수 μžˆμ–΄ λ””λ²„κΉ…ν•˜κΈ°μ— μœ λ¦¬ν•©λ‹ˆλ‹€.

νƒ€μž…μŠ€ν¬λ¦½νŠΈλ₯Ό μ‚¬μš©ν•  λ•Œ μ°Έκ³ ν•  팁

1. any λŒ€μ‹  unknown을 μ‚¬μš©ν•˜μž

any νƒ€μž…μ€ λͺ¨λ“  νƒ€μž…μ„ 받아듀이기 λ•Œλ¬Έμ— νƒ€μž…μŠ€ν¬λ¦½νŠΈμ˜ 이점을 μ—†μ•±λ‹ˆλ‹€.
λΆˆκ°€ν”Όν•œ κ²½μš°μ—λ§Œ μ‚¬μš©ν•˜λŠ” 것을 ꢌμž₯ν•©λ‹ˆλ‹€.

νƒ€μž…μ„ 아직 단정할 수 μ—†λŠ” κ²½μš°μ—λŠ”
unknown을 μ‚¬μš©ν•œ ν›„ νƒ€μž…κ°€λ“œλ₯Ό 톡해 νƒ€μž…μ„ μ’ν˜€λ‚˜κ°€λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€λ‹€.

2. νƒ€μž… κ°€λ“œ

νƒ€μž… κ°€λ“œλŠ” νƒ€μž…μ„ μ’νžˆλŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.
νƒ€μž… κ°€λ“œλ₯Ό ν•˜λŠ” λ°©λ²•μ—λŠ” μ—¬λŸ¬ 가지가 μžˆμŠ΅λ‹ˆλ‹€.

instanceof와 typeof

function padLeft(padding: number | string, input: string): string {
  if (typeof padding === 'number') {
    return ' '.repeat(padding) + input;
  }
  return padding + input;
}

μœ„μ™€ 같이 padding의 νƒ€μž…μ΄ ν•œ 가지가 아닐 경우,
typeofλ₯Ό μ‚¬μš©ν•˜μ—¬ νƒ€μž…μ„ ꡬ체화 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

class CustomError extends Error {
  constructor() {
    super();
  }

  get message() {
    return 'μ»€μŠ€ν…œ μ—λŸ¬μž…λ‹ˆλ‹€';
  }
}

async function fetchSomething() {
  try {
    //fetch둜 μš”μ²­μ„ ν•˜λŠ” ν•¨μˆ˜
  } catch (e) {
    //eλŠ” unknown νƒ€μž…. Error νƒ€μž…μ„ λͺ…μ‹œμ μœΌλ‘œ μž…λ ₯해쀄 수 μ—†μŒ.

    if (e instanceof CustomError) {
      //do something
    }
  }
}

μœ„μ™€ 같은 κ²½μš°μ—λŠ” catch 문의 e의 νƒ€μž…μ„ Error νƒ€μž…μœΌλ‘œ λͺ…μ‹œμ μœΌλ‘œ 선언해쀄 수 μ—†κΈ° λ•Œλ¬Έμ—

instanceof Error λ˜λŠ” Error νƒ€μž…μ„ 상속받은 클래슀λ₯Ό ν™œμš©ν•˜μ—¬ type을 쒁힌 후에 error 처리λ₯Ό 해쀄 수 μžˆμŠ΅λ‹ˆλ‹€.

in

객체에 ν‚€κ°€ μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μΈν•˜λŠ” μš©λ„λ‘œ μ‚¬μš©λ©λ‹ˆλ‹€.

type Fish = { swim: () => void };
type Bird = { fly: () => void };

function move(animal: Fish | Bird) {
  if ('swim' in animal) {
    return animal.swim();
  }

  return animal.fly();
}

in을 μ‚¬μš©ν•΄μ„œ 객체 μ•ˆμ— ν•΄λ‹Ή 킀값이 μžˆλŠ”μ§€ ν™•μΈν•˜λŠ” λ°©μ‹μœΌλ‘œ νƒ€μž…κ°€λ“œλ₯Ό ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

3. μ œλ„€λ¦­

μ œλ„€λ¦­μ€ λ‹€μ–‘ν•œ νƒ€μž…μ˜ κ°’μœΌλ‘œ λΉ„μŠ·ν•œ μž‘μ—…μ„ ν•  λ•Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

function identity<Type>(arg: Type): Type {
  return arg;
}

const myIdentity = identity<number>(123);
console.log(myIdentity);
// 123

const myIdentity2 = identity<string>('123');
console.log(myIdentity2);
// '123'

identity ν•¨μˆ˜λŠ” μ œλ„€λ¦­μ„ μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€.
같은 λ™μž‘μ„ ν•˜μ§€λ§Œ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•  λ•Œ νƒ€μž…μ„ μž…λ ₯ν•˜μ—¬ λ‹€μ–‘ν•œ νƒ€μž…μ˜ μΈμžλ“€μ„ 받을 수 있게 ν–ˆμŠ΅λ‹ˆλ‹€.

4. 인덱슀 μ‹œκ·Έλ‹ˆμ²˜

객체의 킀에 μ›ν•˜λŠ” νƒ€μž…μ„ λΆ€μ—¬ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€.

type OnlyBoolsAndHorses = {
  [key: string]: boolean | Horse;
};

const conforms: OnlyBoolsAndHorses = {
  del: true,
  rodney: false,
};

동적인 객체λ₯Ό μ •μ˜ν•  λ•Œ μœ μš©ν•˜μ§€λ§Œ,
ν‚€μ˜ λ²”μœ„κ°€ μ§€λ‚˜μΉ˜κ²Œ 컀지기 λ•Œλ¬Έμ— 객체의 ν‚€λ₯Ό λ™μ μœΌλ‘œ μ„ μ–Έν•˜λŠ” 경우λ₯Ό 지양해야 ν•©λ‹ˆλ‹€.

λŸ°νƒ€μž„ λ•ŒκΉŒμ§€ 객체의 속성을 μ•Œ 수 없을 κ²½μš°μ—λ§Œ 인덱슀 μ‹œκ·Έλ‹ˆμ²˜λ₯Ό μ‚¬μš©ν•˜λŠ” 것을 ꢌμž₯ν•©λ‹ˆλ‹€.
(예λ₯Ό λ“€μ–΄ CSV νŒŒμΌμ„ λ‘œλ“œν•΄μ„œ 데이터λ₯Ό κ°€μ Έμ˜€λŠ” 경우)

interface CatInfo {
  age: number;
  breed: string;
}

type CatName = 'miffy' | 'boris' | 'mordred';

//Record νƒ€μž…
const cats: Record<CatName, CatInfo> = {
  miffy: { age: 10, breed: 'Persian' },
  boris: { age: 5, breed: 'Maine Coon' },
  mordred: { age: 16, breed: 'British Shorthair' },
};

//λ§€ν•‘λœ νƒ€μž…μ„ μ‚¬μš©ν•œ 인덱슀 μ‹œκ·Έλ‹ˆμ²˜
type Cat = { [name: 'miffy' | 'boris' | 'mordred']: CatInfo };

Recordλ‚˜ λ§€ν•‘λœ νƒ€μž…μ„ μ‚¬μš©ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.


μ°Έκ³ :

μ΄νŽ™ν‹°λΈŒ νƒ€μž…μŠ€ν¬λ¦½νŠΈ

https://www.typescriptlang.org/docs/handbook/intro.html,