TS

[TS] : any unknown union

κΆŒμŠΎν–„ 2023. 8. 21. 23:59

any < unknown < union

개인적으둜 TS κ°€ JS 와 κ°€μž₯ 큰 차별점을 두고 μžˆλŠ” 뢀뢄이라 함은, λ°μ΄ν„°μ˜ ν˜•μ‹μ„ "λͺ…μ‹œ"ν•  수 μžˆλŠ” 뢀뢄이라고 μƒκ°ν•œλ‹€.

λ°μ΄ν„°μ˜ νƒ€μž…μ΄ "λŸ°νƒ€μž„"에 κ²°μ •λ˜λŠ” JS와 달리 TSλŠ” 컴파일 κ³Όμ •μ—μ„œ νƒ€μž…μ΄ μ •ν•΄μ§€κΈ° λ•Œλ¬Έμ—, 보톡은 TSμ—μ„œ 각 λ°μ΄ν„°μ˜ νƒ€μž…μ„ λͺ…μ‹œμ μœΌλ‘œ μ§€μ •ν•΄ μ£Όμ§€λ§Œ,

μ–΄μ©” 수 없이 가변적인 νƒ€μž…μ˜ 데이터λ₯Ό μ €μž₯ν•˜κ³  μ‹Άλ‹€λ©΄ anyλ₯Ό μ“°κΈ°λ³΄λ‹€λŠ” unknown을 μ‚¬μš©λŠ”κ²ƒμ΄ 쒋은 것 κ°™λ‹€.
그리고, 가변적인 νƒ€μž…μ„ 일일이 μ •μ˜ν•  수 μžˆλ‹€λ©΄ union 을 μ‚¬μš©ν•˜λŠ” 것이 제일 쒋은 λ°©μ•ˆμ΄λΌλŠ” 생각이 λ“ λ‹€.

λ¬Όλ‘  개인적인 생각이닀.

 

any

TS μ—μ„œ any νƒ€μž…μ€ λͺ¨λ“  νƒ€μž…μ˜ 슈퍼 νƒ€μž…μ΄λΌκ³  μƒκ°ν•˜λ©΄ λœλ‹€.

μ–΄λ–€ νƒ€μž…μ˜ 값이든 μ €μž₯ν•  수 μžˆλ‹€λŠ” 의미λ₯Ό κ°–κ³  있기 λ•Œλ¬Έμ΄λ‹€.

JS 의 object νƒ€μž…κ³Ό 같은 μ΅œμƒμœ„ νƒ€μž…μ΄λΌκ³  μƒκ°ν•˜λ©΄ νŽΈν•˜λ‹€.

 

any μ‚¬μš© 사둀

let anything: any;
anything = 5;
anything = 'Hello';
anything = { id: 1, name: 'John' };

anything μ΄λΌλŠ” μ‹λ³„μžμ˜ νƒ€μž…μ€ any둜 λͺ…μ‹œν•΄μ£Όμ—ˆλ‹€.

λ”°λΌμ„œ μž¬ν• λ‹Ήμ„ 톡해 숫자 / 문자 / object의 λͺ¨λ“  ν˜•νƒœκ°€ μ •μƒμ μœΌλ‘œ λ‹΄μ•„μ§€λŠ” 것을 λ³Ό 수 μžˆλ‹€.

 

TS μ—μ„œ any λ₯Ό μ‚¬μš©ν•¨μ— λŒ€ν•˜μ—¬

μš°λ¦¬κ°€ TS λ₯Ό μ‚¬μš©ν•˜λŠ” 주된 μ΄μœ μ™€ λͺ©μ μ€‘μ˜ ν•˜λ‚˜λŠ” ν”„λ‘œκ·Έλž¨μ˜ νƒ€μž… μ•ˆμ •μ„±μ„ ν™•λ³΄ν•˜κΈ° μœ„ν•œ 것이닀.

그런데, any νƒ€μž…μ€ κ·Έ λͺ©μ μ„±μ—μ„œ 쑰금 λ²—μ–΄λ‚œ λŠλ‚Œμ΄ λ“ λ‹€.

any νƒ€μž…μ€ μ½”λ“œμ˜ μ•ˆμ •μ„±κ³Ό μœ μ§€ λ³΄μˆ˜μ„±μ„ μ €ν•΄ν•  수 μžˆλ‹€κ³  ν•©λ‹ˆλ‹€.

 

unknown

any의 λŒ€μ²΄μ œ

unknown νƒ€μž…μ€ any νƒ€μž…κ³Ό λΉ„μŠ·ν•œ 역할을 ν•˜μ§€λ§Œ 더 μ•ˆμ „ν•œ λ°©μ‹μœΌλ‘œ λ™μž‘ν•œλ‹€.

unknown νƒ€μž…μ˜ λ³€μˆ˜μ—λ„ any와 같이 λͺ¨λ“  νƒ€μž…μ˜ 값을 μ €μž₯ν•  수 μžˆμ–΄μš”.

ν•˜μ§€λ§Œ, κ·Έ 값을 λ‹€λ₯Έ νƒ€μž…μ˜ λ³€μˆ˜μ— ν• λ‹Ήν•˜κΈ° μœ„ν•΄μ„  λͺ…μ‹œμ μœΌλ‘œ νƒ€μž…μ„ ν™•μΈν•΄μ•Όλ§Œ ν•œλ‹€.

 

unknown μ‚¬μš© 사둀

μ‹λ³„μžμ˜ νƒ€μž…μ„ unknown으둜 μ§€μ •ν•΄μ£Όκ³ , ν• λ‹Ήν•˜λŠ” 값을 λ¬Έμžμ—΄λ‘œ ν• λ‹Ήν–ˆλ‹€.

let unknownValue: unknown = 'λ‚˜λŠ” λ¬Έμžμ—΄';
console.log(unknownValue); // λ‚˜λŠ” λ¬Έμžμ—΄

let stringValue: string;
stringValue = unknownValue; // μ—λŸ¬ λ°œμƒ! unknownValueκ°€ stringμž„μ΄ 보μž₯이 μ•ˆλ¨
stringValue = unknownValue as string;
console.log(stringValue); // λ‚˜λŠ” λ¬Έμžμ—΄

λ¬Έμžμ—΄λ‘œ μ§€μ •ν•œ μ‹λ³„μžμ™€ μœ„μ— λ¬Έμžμ—΄μ„ ν• λ‹Ήν•œ μ‹λ³„μžμ— λ“±ν˜Έμ—°μ‚°μžλ₯Ό 톡해 λ¬Έμžμ—΄μ„ λ‹΄κ³ μžˆλŠ” unknown 데이터λ₯Ό ν• λ‹Ήν•œλ‹€λ©΄,
errorκ°€ λ°œμƒμ΄ λœλ‹€.

λ‹€λ§Œ, unknown을 alias둜 λ¬Έμžμ—΄μ΄λΌκ³  λͺ…μ‹œμ μœΌλ‘œ ν‘œν˜„ν•΄μ€€λ‹€λ©΄, μ •μƒμ μœΌλ‘œ 할당이 되고, console.log에도 좜λ ₯값이 μ •μƒμ μœΌλ‘œ ν• λ‹Ήν•œ λ¬Έμžμ—΄ 값이 λ‚˜μ˜€λŠ”κ²ƒμ„ 확인 ν•  수 μžˆλ‹€.

κ·Έλž˜μ„œ unkwown νƒ€μž…μ˜ λ³€μˆ˜λ₯Ό λ‹€λ₯Έ κ³³μ—μ„œ μ‚¬μš©ν•˜λ €λ©΄ νƒ€μž… 단언을 톡해 νƒ€μž… 보μž₯을 ν•˜μ—¬ μ‚¬μš©ν•  수 μžˆλ‹€.

μœ„μ˜ aliasλ₯Ό ν†΅ν•œ λͺ…μ‹œμ  ν‘œν˜„μ΄ νƒ€μž… 단언 이닀.

 

또 λ‹€λ₯Έ λ°©λ²•μœΌλ‘œλŠ” typeof λ₯Ό μ‚¬μš©ν•˜λŠ” 방법이 μžˆλ‹€.

let unknownValue: unknown = 'λ‚˜λŠ” λ¬Έμžμ—΄';
let stringValue: string;

if (typeof unknownValue === 'string') {
  stringValue = unknownValue;
  console.log('unknownValueλŠ” λ¬Έμžμ—΄');
} else {
  console.log('unknownValueλŠ” λ¬Έμžμ—΄μ΄ μ•„λ‹ˆλ‹€');
}

typeof ν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•΄μ„œ 미리 νƒ€μž…μ„ μ²΄ν¬ν•œ ν›„,
unknown νƒ€μž…μ˜ λ³€μˆ˜λ₯Ό string νƒ€μž…μ˜ λ³€μˆ˜μ— ν• λ‹Ήν•  수 μžˆλ‹€.

 

unknown 의 ν•œκ³„

unknown νƒ€μž…μ΄ κ·Έλ‚˜λ§ˆ μž¬ν• λ‹Ήμ„ ν•  λ•Œ νƒ€μž… 체크가 λ˜μ–΄μ„œ μ•ˆμ „ν•¨μ„ 보μž₯ν•  수 μžˆλ‹€.

λ‹€λ§Œ, unknown νƒ€μž…λ„ κ²°κ΅­ μž¬ν• λ‹Ήμ΄ μΌμ–΄λ‚˜μ§€ μ•ŠμœΌλ©΄ νƒ€μž… μ•ˆμ „μ„±μ΄ 보μž₯이 λ˜μ§€ μ•ŠλŠ” λ‹€λŠ” νŠΉμ§•μ΄ μ‘΄μž¬ν•œλ‹€.

 

union

이럴 λ•Œλ₯Ό μœ„ν•΄ union νƒ€μž…μ΄λΌλŠ” 것이 μ‚¬μš©λ©λ‹ˆλ‹€.

union 은 μ—¬λŸ¬ νƒ€μž… 쀑 ν•˜λ‚˜λ₯Ό κ°€μ§ˆ 수 μžˆλŠ” λ³€μˆ˜λ₯Ό μ„ μ–Έν•  λ•Œ μ‚¬μš©μ΄ λœλ‹€.

union은 < | > μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜μ—¬ μ—¬λŸ¬ νƒ€μž…μ„ κ²°ν•©ν•˜μ—¬ ν‘œν˜„ν•  μˆ˜κ°€ μžˆλ‹€.

 

union μ‚¬μš© 사둀

type StringOrNumber = string | number; // μ›ν•œλ‹€λ©΄ | boolean μ΄λŸ°μ‹μœΌλ‘œ νƒ€μž… μΆ”κ°€κ°€ κ°€λŠ₯ν•˜λ‹€.

function processValue(value: StringOrNumber) {
  if (typeof value === 'string') {
    // valueλŠ” μ—¬κΈ°μ„œ string νƒ€μž…μœΌλ‘œ κ°„μ£Ό
    console.log('String value:', value);
  } else if (typeof value === 'number') {
    // valueλŠ” μ—¬κΈ°μ„œ number νƒ€μž…μœΌλ‘œ κ°„μ£Ό
    console.log('Number value:', value);
  }
}

processValue('Hello');
processValue(42);
  • TypeScriptλ₯Ό μ“°λ©΄μ„œ μ—¬λŸ¬ νƒ€μž…μ„ ν•˜λ‚˜μ˜ λ³€μˆ˜λ‘œ ν•΄κ²°ν•˜κ² λ‹€λŠ” 생각은 가급적 μ§€μ–‘ν•˜λŠ” 것이 μ’‹λ‹€.
  • 이런 μ‚¬μ†Œν•œ μŠ΅κ΄€λ“€μ΄ μ½”λ“œμ˜ μ•ˆμ •μ„±μ„ 높이고 μœ μ§€ λ³΄μˆ˜μ„±μ„ κ°œμ„ ν•  수 μžˆλ‹€λŠ” 생각이 λ“ λ‹€.

 

 

#ts #union #any #unknown #