WEB/React

[ λͺ¨λ˜ λ¦¬μ•‘νŠΈ : Deep Dive ] - λ¦¬μ•‘νŠΈ κ°œλ°œμ—μ„œ λ°˜λ“œμ‹œ μ•Œμ•„μ•Όν•˜λŠ” JS

Happhee.dev 2023. 11. 28. 18:55

πŸ“ λ“€μ–΄κ°€κΈ°

μ΄λ²ˆμ—λŠ” λ¦¬μ•‘νŠΈ Deep Dive의 첫번째 μž₯을 톺아보며 λΆ€μ‘±ν•œ 뢀뢄을 메꿔보렀고 ν•œλ‹€.

κ°„λ‹¨ν•œ μš”μ•½λ³΄λ‹€λŠ” μ€‘μš”ν•˜κ±°λ‚˜ 미처 κ°„κ³Όν–ˆλ˜ 뢀뢄듀을 μ§šμ–΄λ³΄κ³ μž ν•œλ‹€. 


βœ…  μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 또 λ‹€λ₯Έ 비ꡐ, Object.is

  1.  ==  πŸ‘‰ κ°™μŒμ„ λΉ„κ΅ν•˜κΈ° 전에 μ–‘μͺ½μ΄ 같은 νƒ€μž…μ΄ μ•„λ‹ˆλΌλ©΄, 비ꡐ할 수 μžˆλ„λ‘ κ°•μ œλ‘œ ν˜•λ³€ν™˜μ„ μ§„ν–‰ν•œλ‹€.
  2. === πŸ‘‰ κ°•μ œ ν˜• λ³€ν™˜μ„ μ§„ν–‰ν•˜μ§€ μ•ŠμœΌλ©°, Object.is와 달리 κ°œλ°œμžκ°€ κΈ°λŒ€ν•˜λŠ” λ°©ν–₯으둜 λΉ„κ΅λ˜μ§€ μ•Šμ„ 수 μžˆλ‹€. 
5 == '5' 			// true
Object.is(5, '5'); 	// false

Number.NaN === NaN	// false
Object.is(Number.NaN, NaN)	//true

 

β—οΈλ‹€λ§Œ, μ£Όμ˜ν•΄μ•Ό ν•  점은 객체 λΉ„κ΅μ—μ„œλŠ” 차이가 μ—†λ‹€λŠ” 것이닀.

Object.isλŠ” 동등비ꡐ ( === )κ°€ κ°€μ§€λŠ” ν•œκ³„λ₯Ό κ·Ήλ³΅ν•˜κΈ° μœ„ν•΄ λ§Œλ“€μ–΄μ§„ 것이며, 객체 κ°„ 비ꡐ에 μžˆμ–΄μ„œλŠ” JS의 νŠΉμ§• λ•Œλ¬Έμ— μ—¬μ „νžˆ ν•œκ³„κ°€ μžˆλ‹€. 

 

πŸ“λ¦¬μ•‘νŠΈμ—μ„œμ˜ 동등 비ꡐ κ³Όμ •

function is(x: any, y: any) {
  return (
    (x === y && (x !== 0 || 1 / x === 1 / y)) || (x !== x && y !== y) 
  );
}

// Object.isκ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄, μœ„ ν•¨μˆ˜ μ‚¬μš©
const objectIs: (x: any, y: any) => boolean =
  typeof Object.is === 'function' ? Object.is : is;

export default objectIs;

 

기본적으둜 λ¦¬μ•‘νŠΈμ—μ„œλŠ” μœ„μ˜ is ν•¨μˆ˜λ₯Ό 기반으둜 shallowEqual을 λΉ„κ΅ν•˜κ³  μžˆλ‹€.

μ•„λž˜μ²˜λŸΌ 말이닀. 

function shallowEqual(objA: mixed, objB: mixed): boolean {
	// Object.is둜 λ¨Όμ € 비ꡐλ₯Ό μˆ˜ν–‰
  if (is(objA, objB)) {
    return true;
  }

  if (
    typeof objA !== 'object' ||
    objA === null ||
    typeof objB !== 'object' ||
    objB === null
  ) {
    return false;
  }
// ν‚€λ₯Ό κΊΌλ‚΄κ³ 
  const keysA = Object.keys(objA);
  const keysB = Object.keys(objB);

  if (keysA.length !== keysB.length) {
    return false;
  }

  // A의 ν‚€λ₯Ό κΈ°μ€€μœΌλ‘œ, B의 킀와 값을 체크 , 객체간 얕은 λΉ„κ΅λ§Œ μˆ˜ν–‰ 
  for (let i = 0; i < keysA.length; i++) {
    const currentKey = keysA[i];
    if (
      !hasOwnProperty.call(objB, currentKey) ||
      !is(objA[currentKey], objB[currentKey])
    ) {
      return false;
    }
  }

  return true;
}

export default shallowEqual;

 

ν•˜μ§€λ§Œ, 여기에도 단점은 μžˆλ‹€.

λ°”λ‘œ 얕은 λΉ„κ΅λ§Œ κ°€λŠ₯ν•˜λ‹€λŠ” 것이닀.  λ•Œλ¬Έμ— μš°λ¦¬λŠ” useMemoλ₯Ό μ‚¬μš©ν•  λ•Œ 이 뢀뢄을 μΈμ§€ν•˜κ³  μžˆμ–΄μ•Ό ν•œλ‹€.

 


 

βœ… ν•¨μˆ˜

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ ν•¨μˆ˜λŠ” 일급 객체이닀.

λ‹€λ₯Έ 객체듀에 일반적으둜 적용 κ°€λŠ₯ν•œ 연산을 λͺ¨λ‘ μ§€μ›ν•˜λ©°, μ΄λŠ” ν•¨μˆ˜κ°€ λ‹€λ₯Έ ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜κ°€ λ˜κ±°λ‚˜ λ°˜ν™˜κ°’, 할당이 κ°€λŠ₯ν•˜λ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€.

 

κ·Έλž˜μ„œ μš°λ¦¬λŠ” κ³ μ°¨ ν•¨μˆ˜λ₯Ό 생성할 수 μžˆλŠ” 것이닀.

const add = function(a){
	return function(b){
    	return a+b
    }
}

add(1)(3) // 4

 

λ¦¬μ•‘νŠΈμ—μ„œλŠ” κ³ μ°¨ ν•¨μˆ˜μ™€ μœ μ‚¬ν•˜κ²Œ κ³ μ°¨ μ»΄ν¬λ„ŒνŠΈλ₯Ό λ§Œλ“€μ–΄ μ»΄ν¬λ„ŒνŠΈ λ‚΄λΆ€μ—μ„œ κ³΅ν†΅μœΌλ‘œ κ΄€λ¦¬λ˜λŠ” λ‘œμ§μ„ 뢄리해 관리할 수 μžˆκΈ°λ„ ν•˜λ‹€.

ν•΄λ‹Ή 뢀뢄에 λŒ€ν•΄μ„œλŠ” 3.2μ ˆμ—μ„œ λ‹€λ£¨κ³ μž ν•œλ‹€.

 

κ·Έλ ‡λ‹€λ©΄ λ¦¬μ•‘νŠΈμ—μ„œ μ–΄λ–€ λ°©μ‹μœΌλ‘œ ν•¨μˆ˜λ₯Ό ν™œμš©ν•΄μ•Ό ν• κΉŒ?

 

1️⃣  ν•¨μˆ˜μ˜ λΆ€μˆ˜ 효과λ₯Ό μ΅œλŒ€ν•œ μ–΅μ œν•˜λΌ.

μš°λ¦¬κ°€ ν”νžˆ λ§ν•˜λŠ” λΆ€μˆ˜νš¨κ³Όλ₯Ό μ–΅μ œν•œ ν•¨μˆ˜λŠ” μˆœμˆ˜ν•¨μˆ˜λΌκ³  λ– μ˜¬λ¦΄ 수 μžˆλ‹€.

λ¬Όλ‘  μ»΄ν¬λ„ŒνŠΈλ₯Ό μˆœμˆ˜ν•¨μˆ˜λ‘œ λ§Œλ“€κ²Œ λœλ‹€λ©΄, 예츑 κ°€λŠ₯ν•˜κ³  μ•ˆμ •μ μ΄κ²Œ μ»΄ν¬λ„ŒνŠΈλ₯Ό λ§Œλ“€ 수 μžˆλ‹€.

 

ν•˜μ§€λ§Œ, λͺ¨λ“  κ³³μ—μ„œ κ·Έλž˜μ•Όλ§Œ ν•˜λŠ” 것은 μ•„λ‹ˆλ‹€.

사싀, μ»΄ν¬λ„ŒνŠΈ λ‚΄λΆ€μ—μ„œ ν•΄λ‹Ή APIλ₯Ό ν˜ΈμΆœν•˜κ³  console.log( )λ₯Ό μ‹€ν–‰μ‹œν‚€κΈ°λ§Œ 해도 λΆ€μˆ˜νš¨κ³Όλ₯Ό κ°€μ Έμ˜€κΈ°μ— μ‹€λ¬΄μ—μ„œ μ΄λŠ” λ”λ”μš± ν”Όν•˜κΈ° μ–΄λ ΅λ‹€. κ·Έλž˜μ„œ μš°λ¦¬λŠ” 이λ₯Ό μ–΅μ œν•˜λŠ” λ°©ν–₯으둜 κ°€μ•Ό λ˜λŠ” 것이닀.

 

useEffect의 μ‚¬μš©μ„ 없앨 μˆ˜λŠ” μ—†μ§€λ§Œ, μž‘λ™μ„ μ΅œμ†Œν™”ν•˜μ—¬ ν•¨μˆ˜μ˜ 역할을 μ’νžˆλŠ” 것이 μ€‘μš”ν•˜λ‹€. 

 

2️⃣ κ°€λŠ₯ν•œ ν•œ ν•¨μˆ˜λ₯Ό μž‘κ²Œ λ§Œλ“€μ–΄λΌ.

ν•¨μˆ˜λ‹Ή μ½”λ“œμ˜ 길이가 κΈΈμ–΄μ§ˆμˆ˜λ‘ 문제λ₯Ό μΌμœΌν‚¬ μ—¬μ§€κ°€ μžˆλŠ” μ½”λ“œκ°€ λ°œμƒν•œ ν™•λ₯ μ΄ λ†’μ•„μ§€κ³ 

λ‚΄λΆ€μ—μ„œ μ–΄λ–€ 일이 λ°œμƒν•˜λŠ”μ§€ μΆ”μ ν•˜κΈ° μ–΄λ €μ›Œμ§„λ‹€.

 

이 외에도 ❗️쀑첩이 μ–Όλ§ˆλ‚˜ 많고, μ½œλ°±μ€ μ–Όλ§ˆλ‚˜ μžˆλŠ”μ§€β—οΈμ— λ”°λ₯Έ λ¬Έμ œλ„ λ°œμƒν•  수 μžˆλ‹€.

졜적의 ν•¨μˆ˜ 크기λ₯Ό 단언할 μˆ˜λŠ” μ—†μœΌλ‚˜ κ°€λŠ₯ν•œ ν•œ ν•¨μˆ˜μ˜ 크기λ₯Ό μž‘κ²Œ ν•˜λŠ” 것이 μ’‹λ‹€.

 

 

3️⃣ λˆ„κ΅¬λ‚˜ 이해할 수 μžˆλŠ” 이름을 뢙여라.

μ–΄λ””μ—μ„œ μ–΄λ–€ κ°œλ°œμ„ 해도 이 뢀뢄은 μ€‘μš”ν•˜λ‹€κ³  μƒκ°ν•œλ‹€.

μ»΄ν¬λ„ŒνŠΈ λ‚΄μ—μ„œ λΉ„μ¦ˆλ‹ˆμŠ€ 둜직이 λ“€μ–΄κ°€λŠ” μˆœκ°„, 이름이 λͺ¨ν˜Έν•˜κ±°λ‚˜ ν•΄λ‹Ή κΈ°λŠ₯을 μ˜ˆμΈ‘ν•  수 μ—†λ‹€λ©΄ ν˜‘μ—…ν•˜κΈ°λŠ” λ”μš± 더 μ–΄λ €μš΄ ꡬ쑰둜 λ³€ν•΄κ°ˆ 것이닀. λ”°λΌμ„œ κ°€λŠ₯ν•œ ν•œ ν•¨μˆ˜μ˜ 이름은 κ°„κ²°ν•˜κ³  μ΄ν•΄ν•˜κΈ° μ‰½κ²Œ λΆ™μ΄λŠ” 것이 μ’‹λ‹€.

 

이것은 μ½œλ°±ν•¨μˆ˜μ—λ„ μ μš©ν•  수 μžˆλ‹€.

useEffect(function apiRequest(){

},[])

 

이λ₯Ό 톡해 useEffectμ•ˆμ— μ½”λ“œλ₯Ό μ‚΄νŽ΄λ³΄μ§€ μ•Šμ•„λ„, λ‚΄λΆ€μ—μ„œ μ–΄λ–€ κΈ°λŠ₯을 μˆ˜ν–‰ν•˜λŠ”μ§€ 미리 μ˜ˆμΈ‘ν•  수 μžˆλ‹€λŠ” μž₯점을 κ°€μ§€κ²Œ λœλ‹€.


βœ… 클래슀 

ν˜„μž¬λŠ” ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈλ₯Ό 주둜 μ‚¬μš©ν•˜κ³  μžˆμ§€λ§Œ, ν΄λž˜μŠ€ν˜•μ„ μ΄ν•΄ν•˜κ²Œ λœλ‹€λ©΄ λ¦¬μ•‘νŠΈμ˜ μž‘λ™λ°©μ‹μ„ μˆ˜μ›”ν•˜κ²Œ 받아듀일 수 μžˆμ„ 것이닀.

 

πŸ“ Object.getPrototype( )

Object.getPrototypeκ³Ό λ™μΌν•˜κ²Œ μž‘λ™ν•˜λŠ” 것은 λ°”λ‘œ _ _ proto_ _ 이닀.

ν•˜μ§€λ§Œ, _ _proto_ _λŠ” 가급적 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 것이 μ’‹λ‹€. μ™œλƒν•˜λ©΄, typeof null === 'object' 와 μœ μ‚¬ν•˜κ²Œ μ›λž˜ μ˜λ„ν•œ ν‘œμ€€μ€ μ•„λ‹ˆμ§€λ§Œ κ³Όκ±° λΈŒλΌμš°μ €κ°€ 이λ₯Ό μ‚¬μš©ν–ˆκΈ°μ— μœ μ§€λ˜λŠ” κΈ°λŠ₯이기 λ•Œλ¬Έμ΄λ‹€.

 

μ—¬κΈ°μ„œ, ν”„λ‘œν† νƒ€μž… μ²΄μ΄λ‹μ˜ νŠΉμ„±μ„ λ°œκ²¬ν•  수 μžˆλ‹€.

λͺ¨λ“  κ°μ²΄λŠ” ν”„λ‘œν†  νƒ€μž…μ„ κ°€μ§€κ³  있고, νŠΉμ • 속성을 μ°Ύμ„λ•Œ μžμ‹ μœΌλ‘œλΆ€ν„° μ‹œμž‘ν•΄μ„œ μ΅œμƒμœ„ 객체인 ObjectκΉŒμ§€ ν›‘κ²Œ λœλ‹€.

 

toString을 λŒ€λΆ€λΆ„μ˜ κ°μ²΄μ—μ„œ μ‚¬μš©ν•  수 μžˆλŠ” 것도 λΉ„μŠ·ν•œ 논리이닀.

 

클래슀둜 λ§Œλ“  ν•¨μˆ˜λ₯Ό babel이 μ–΄λ–»κ²Œ λ³€ν™˜ν•˜λŠ”μ§€ 확인할 수 μžˆλŠ” μ‚¬μ΄νŠΈμ΄λ‹€. ν΄λ¦­ν•΄μ„œ μ‚΄νŽ΄λ³΄μž.

 


βœ… Typescript

μ΄μ œλŠ” μ—†μ–΄μ„œλŠ” μ•ˆλ  κ°œλ°œμ–Έμ–΄λ‘œ μžλ¦¬μž‘μ€ νƒ€μž…μŠ€ν¬λ¦½νŠΈλ₯Ό μ–΄λ–»κ²Œ λ¦¬μ•‘νŠΈμ— 효과적으둜 μž‘μ„±ν•΄μ•Ό ν•˜λŠ”μ§€ μ‚΄νŽ΄λ³΄μž.

 

 

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

anyλŠ” νƒ€μž…μŠ€ν¬λ¦½νŠΈλ₯Ό μ‚¬μš©ν•˜λŠ” 의미λ₯Ό μ—†μ• λŠ” νƒ€μž…μ΄λ‹€.

μ™œλƒν•˜λ©΄, λŸ°νƒ€μž„μ— λͺ¨λ“  νƒ€μž…μ„ 받아듀이기에 사싀상 μžλ°”μŠ€ν¬λ¦½νŠΈμ™€λŠ” λ‹€λ₯Όκ²Œ μ—†λ‹€.

 

κ·Έλž˜μ„œ λΆˆκ°€ν”Όν•˜κ²Œ νƒ€μž…μ„ 단정할 수 μ—†λŠ” 뢀뢄에 λŒ€ν•΄μ„œλŠ” unknown을 μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€.

μ–΄λ–€ 값도 ν• λ‹Ήν•  수 μžˆμœΌλ‚˜, νƒ€μž… 쒁히기 μ΄ν›„μ—λ§Œ μ‚¬μš©ν•  수 μžˆλ‹€. μ΄λŠ” top type으둜 λΆˆλ¦¬κΈ°λ„ ν•œλ‹€.

const getTodoItem = (callback:unknown) => {
	if( typeof callback === 'function') callback();
    
    throw new Error('callback은 ν•¨μˆ˜μ—¬μ•Ό ν•©λ‹ˆλ‹€')
}

 

이λ₯Ό 잘 ν™œμš©ν•˜κΈ°λ§Œ ν•œλ‹€λ©΄, μ˜ˆμƒμΉ˜ λͺ»ν•œ νƒ€μž…μ„ λ°›μŒκ³Ό λ™μ‹œμ— μ•ˆμ „ν•œ μ‚¬μš©λ„ κ°€λŠ₯ν•˜κ²Œ λœλ‹€.

 

μ•žμ„œ λ§ν•œ top type의 λ°˜λŒ€ κ°œλ…μ€ bottom type 이닀. μ΄λŠ” neverλ₯Ό μ§€μΉ­ν•œλ‹€.

type what1 = string & number
type what2 = ('happehee' | 'seohee') & 'front-end'

 

what1 μ—λŠ” stringκ³Ό numberλ₯Ό λ‘˜λ‹€ λ§Œμ‘±ν•΄μ•Ό ν•˜μ§€λ§Œ, μ΄λŠ” μ‘΄μž¬ν•˜μ§€ μ•ŠκΈ°μ— never둜 νƒ€μž…μ΄ μ§€μ •λœλ‹€.

what2도 λ§ˆμ°¬κ°€μ§€λ‘œ, μ–‘μͺ½μ˜ νƒ€μž…μ— ꡐ차점이 λ°œμƒν•˜μ§€ μ•Šμ•„ neverκ°€ μ„ μ–Έλœλ‹€.

 

2️⃣  νƒ€μž… κ°€λ“œλ₯Ό 적극 ν™œμš©ν•˜μž

νƒ€μž…μ„ μ’νžˆλŠ” 데 도움을 μ£ΌλŠ” 것이 λ°”λ‘œ νƒ€μž… κ°€λ“œμ΄λ‹€. 

 

  1. instanceof πŸ‘‰ μ§€μ •ν•œ μΈμŠ€ν„΄μŠ€κ°€ νŠΉμ • 클래슀의 μΈμŠ€ν„΄μŠ€ 인지 확인할 수 μžˆλŠ” μ—°μ‚°μž
  2. typeof πŸ‘‰ νŠΉμ • μš”μ†Œμ— λŒ€ν•΄ μžλ£Œν˜•μ„ ν™•μΈν•˜λŠ” 데 μ‚¬μš©
  3. in πŸ‘‰ μ–΄λ–€ 객체에 ν‚€κ°€ μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μΈν•˜λŠ”λ° μ‚¬μš©

 

3️⃣ μ œλ„€λ¦­

ν•¨μˆ˜λ‚˜ 클래슀 λ‚΄λΆ€μ—μ„œ 단일 νƒ€μž…μ΄ μ•„λ‹Œ λ‹€μ–‘ν•œ νƒ€μž…μ— λŒ€μ‘ν•˜λ„λ‘ λ„μ™€μ£ΌλŠ” 도ꡬ이닀.

단일 μ œλ„€λ¦­μ΄ μ•„λ‹Œ 닀쀑 μ œλ„€λ¦­μ„ μ‚¬μš©ν•˜λŠ” 경우, T,G λ³΄λ‹€λŠ” μ˜λ―ΈμžˆλŠ” μ œλ„€λ¦­ ν‘œν˜„μ„ μ μ–΄μ£ΌλŠ” 것이 μ’‹λ‹€.

const multipleGeneric<First, Second>(a1 : First , a2: Second):[First, Second]{
	return [a1, a2]
 }
 
 const [a ,b] = multipleGeneric<string, number>('happhee', 12)

 

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

아직도 잘 ν™œμš©ν•˜μ§€ λͺ»ν•˜κ³  μžˆλŠ” νŠΉμ„±μ€‘μ— ν•˜λ‚˜μ΄κΈ°λ„ ν•˜λ‹€. 

  type Happhee = {
  	// πŸ‘‡ μš”λΆ€λΆ„μ΄ 인덱슀 μ‹œκ·Έλ‹ˆμ²˜ 이닀.
    [key: string]: string;
  };
  const happheeKid: Happhee = {
    hobby: 'dance',
    fruite: 'strawberry',
  };

  console.log(happheeKid['hobby']);		// dance
  console.log(happheeKid['fruite']);	// strawberry
  console.log(happheeKid['age']);		// undefined

 

μœ„μ™€ 같이 인덱슀 μ‹œκ·Έλ‹ˆμ²˜λ₯Ό μ‚¬μš©ν•˜λ©΄, 킀에 νƒ€μž…μ„ λΆ€μ—¬ν•  수 μžˆλ‹€λŠ” μž₯점이 있으며 μ΄λŠ” 동적인 객체λ₯Ό μ •μ˜ν•  λ•Œ μœ μš©ν•˜λ‹€. 

 

❗️ λ‹€λ§Œ ν‚€μ˜ λ²”μœ„κ°€ μ»€μ§€λŠ” 경우 ❗️

νƒ€μž…μ˜ λ²”μœ„κ°€ λ„ˆλ¬΄ μ»€μ§€λ―€λ‘œ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” ν‚€λ‘œ μ ‘κ·Όν•˜λ©΄ undefined둜 λ°˜ν™˜λœλ‹€. 

 

λ”°λΌμ„œ 객체의 ν‚€λ₯Ό λ™μ μœΌλ‘œ μ„ μ–Έν•˜λŠ” 경우λ₯Ό μ΅œλŒ€ν•œ μ§€μ–‘ν•˜κ³ , 객체의 νƒ€μž…λ„ ν•„μš”μ— 따라 μ’ν˜€μ•Ό ν•˜λŠ” 과정이 ν•„μš”ν•˜λ‹€.

 

  type Happhee = {
    [key: 'hobboy' | 'fruite' ]: string;
  };
  
  type Happhee = Record<'hobby'|'fruite', string>

 

방법은 두 κ°€μ§€ 이닀. 

  • νƒ€μž…μ„ μ‚¬μš©ν•œ 인덱슀 μ‹œκ·Έλ‹ˆμ²˜

λ‹€λ§Œ 첫 번째의 λ°©λ²•μ—μ„œλŠ” μ•„λž˜μ™€ 같은 였λ₯˜κ°€ λ°œμƒν•œλ‹€.

λ¬Έμžμ—΄ λ¦¬ν„°λŸ΄μ€ μ‚¬μš©ν•  수 μ—†λ‹€.

 

λ•Œλ¬Έμ— μš°λ¦¬λŠ” λ§΅λ“œ νƒ€μž…μ„ μ‚¬μš©ν•΄μ„œ ν•΄λ‹Ή 문제λ₯Ό ν•΄κ²°ν•΄μ•Ό ν•œλ‹€.

 type Info = 'hobby' | 'fruite';
 
 type Happhee = {
    [key in Info ]: string;
  };
  
  type Happhee = Record<'hobby'|'fruite', string>

 

두 번째 방법은 

  • recordλ₯Ό μ‚¬μš©ν•œ νƒ€μž… 쒁히기

μ΄λ ‡κ²Œ νƒ€μž…μ„ μ’ν˜€λ„ Object.keys둜 μ ‘κ·Όν–ˆμ„λ•Œ key의 νƒ€μž…μ΄ string [ ] 둜 μΆ”λ‘ λ˜λŠ” 것을 확인할 수 μžˆλ‹€. 

μ—¬μ „νžˆ ν‚€μ˜ νƒ€μž…μ΄ string이닀.

사싀 κ·Έλž˜μ„œ ν•œλ²ˆ as둜 νƒ€μž…μ„ 단언해주어야 ν•œλ‹€. 

const happheeKeyList = Object.keys(happheeKid);
  (happheeKeyList as Array<keyof Happhee>).map((key) => happheeKid[key]);

 

단언보닀 κ°€λ“œλ‘œ μ•ˆμ •μ μ΄κ²Œ μ‚¬μš©ν•˜κ³  μ‹Άλ‹€λ©΄ μ•„λž˜μ™€ 같이 ν•΄λ‹Ή κ°€λ“œ ν•¨μˆ˜λ₯Ό λ§Œλ“€λ©΄ λœλ‹€.

const guardKeyOf = <T extends Object>(obj: T): Array<keyof T> => {
    return Array.from(Object.keys(obj)) as Array<keyof T>;
 };

guardKeyOf(happheeKid).map((key) => happheeKid[key]);

 

κ°€λ“œ ν•¨μˆ˜κ°€ μž‘λ™ν•˜λŠ” 방식은 λ‹€μŒ μˆœμ„œμ™€ κ°™λ‹€.

 

  1. λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž…μ€ T이닀.
  2. λ°˜ν™˜ 값은 λ§€κ°œλ³€μˆ˜μ˜ ν‚€ νƒ€μž…μ΄λ‹€.

μ •μƒμ μœΌλ‘œ νƒ€μž… 좔둠이 λ˜λŠ” 것을 확인할 수 μžˆλ‹€.

 

κ·Έλ ‡λ‹€λ©΄ μ™œ Object.keysκ°€ string[]으둜 λ§Œλ“€μ–΄μ§„κ±ΈκΉŒ?

πŸ‘‰ νƒ€μž…μŠ€ν¬λ¦½νŠΈμ˜ ꡬ쑰적 타이핑 νŠΉμ§•λ•Œλ¬Έμ— 덕 타이핑이 이루어지기 λ•Œλ¬Έμ΄λ‹€. 즉, νƒ€μž… μ²΄ν¬μ‹œ κ·Έ 값이 κ°€μ§„ ν˜•νƒœμ—λ§Œ μ§‘μ€‘ν•œλ‹€λŠ” 것.

πŸ‘‰ 포괄적인 λŒ€μ‘μ„ μœ„ν•΄ string[]으둜 μ œκ³΅λ˜λŠ” 것이닀.


🌈 μ •λ¦¬ν•˜κΈ°

이번 μ‹œκ°„μ—λŠ” λ¦¬μ•‘νŠΈμ—μ„œ 비ꡐ과정, ν•¨μˆ˜ μž‘μ„± 방법, νƒ€μž… κ°€λ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 방법을 μ‚΄νŽ΄λ³΄μ•˜λ‹€. 

μ‹€λ¬΄μ—μ„œ μ μš©ν•˜μ§€ λͺ»ν•œ λ‚΄μš©λ“€κ³Ό record와 같은 νƒ€μž…μ„ μ‚¬μš©ν•˜λŠ” 방법을 λŠ₯μˆ™ν•˜κ²Œ 닀루면 쒋을 것 κ°™λ‹€λŠ” 생각을 ν•˜κ²Œ λ˜λŠ” μ‹œκ°„μ΄μ—ˆλ‹€.

 


πŸ“š 참고자료