πŸ§‘‍πŸ’» μ§§μ€ν˜Έν‘/JS·TS

[μ΄νŽ™ν‹°λΈŒ νƒ€μž…μŠ€ν¬λ¦½νŠΈ] 객체 λ¦¬ν„°λŸ΄μ˜ νƒ€μž… 체크 : νƒ€μž… ν˜Έν™˜μ„±κ³Ό 신선도

ν•œκ·œμ§„ 2023. 4. 5. 12:50

책을 μ΄μš©ν•œ μŠ€ν„°λ””λ₯Ό ν•˜λ©΄μ„œ ν‰μ†Œμ— 쓰지 μ•ŠλŠ” (κ²½ν—˜μ΄ μ•„λ‹Œ μ±… λ‚΄μš©μ„ μ •λ¦¬ν•˜λŠ”) 글을 μ“°λ©΄μ„œ λ§Žμ€ 고민을 ν•˜κ²Œ λœλ‹€. μ–΄λ–»κ²Œ ν•΄μ•Ό μ™„λ²½νžˆ μ΄ν•΄ν•˜κ³ , μ •λ¦¬ν•˜κ³ , 기둝할 수 μžˆμ„κΉŒ. μ±…μ˜ μˆœμ„œ κ·ΈλŒ€λ‘œ 쓰지 μ•Šκ³  λ‚΄κ°€ μ΄ν•΄ν•œ νλ¦„λŒ€λ‘œ μž¬κ΅¬μ„±ν•΄μ„œ 글을 쓰도둝 λ…Έλ ₯해보렀고 ν•œλ‹€. 효율적인 λ°©λ²•μΈμ§€λŠ” λͺ¨λ₯΄κ² μ§€λ§Œ.

 


 

μ§€λ‚œμ£Όμ— κ³΅λΆ€ν–ˆλ˜ ꡬ쑰적 νƒ€μ΄ν•‘μ˜ κ΄€μ μ—μ„œ 보면 μ•„λž˜μ˜ μ½”λ“œλŠ” 였λ₯˜κ°€ λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€.

interface Room {
    numDoors: number;
    ceilingHeightFt: number;
}

const obj = {
  numDoors: 1,
  ceilingHeightFt: 10;
  elephant: 'present',
}
const r: Room = obj;

μΆ”λ‘ λœ obj의 νƒ€μž…μ€ Roomνƒ€μž…μ˜ λΆ€λΆ„ 집합을 ν¬ν•¨ν•˜λ―€λ‘œ, Room에 ν• λ‹Ή κ°€λŠ₯ν•˜κ³  νƒ€μž… 체컀도 ν†΅ν•œλ‹€. ν•˜μ§€λ§Œ μ΄λŸ¬ν•œ ꡬ쑰적 νƒ€μž… μ²˜λ¦¬λŠ” 무언가가 μ‹€μ œ λ‹€λ£¨λŠ” 것보닀 더 λ§Žμ€ 데이터λ₯Ό λ°›μ•„λ“€μΈλ‹€λŠ” μ˜€ν•΄λ₯Ό λΆˆλŸ¬μΌμœΌν‚¬ 수 μžˆλ‹€λŠ” 약점이 μžˆλ‹€.

 

interface Options {
    title: string;
    darkMode?: boolean;
}

단적인 예둜 μœ„μ˜ μ½”λ“œκ°€ μžˆλ‹€. string νƒ€μž…μ˜ title μ†μ„±λ§Œ μ œλŒ€λ‘œ μžˆλ‹€λ©΄ λͺ¨λ“  κ°μ²΄λŠ” Options νƒ€μž…μ— 속할 수 μžˆλ‹€. νƒ€μž…μ˜ λ²”μœ„κ°€ 맀우 λ„“μ–΄μ§€λŠ” 것.

 

 

신선도(Freshness)

이λ₯Ό μœ„ν•΄ TypeSciptλŠ” ꡬ쑰적으둜 νƒ€μž… ν˜Έν™˜μ„±μ΄ μžˆλŠ” 객체 λ¦¬ν„°λŸ΄μ˜ νƒ€μž… 검사λ₯Ό μ‰½κ²Œ ν•  수 μžˆλ„λ‘ 신선도(Freshness)λΌλŠ” κ°œλ…μ„ μ œκ³΅ν•œλ‹€(λ‹€λ₯Έ 말둜 μ—„κ²©ν•œ 객체 λ¦¬ν„°λŸ΄ 검사라 ν•˜κΈ°λ„ ν•œλ‹€).

 

const r: Room =  {
  numDoors: 1,
  ceilingHeightFt: 10;
  elephant: 'present', //였λ₯˜!!
}

객체 λ¦¬ν„°λŸ΄μΌ λ•Œλ§Œ 이런 μ‹μ˜ νƒ€μž… 검사λ₯Ό μˆ˜ν–‰ν•˜κ³  였λ₯˜λ₯Ό λ‚΄λ±‰λŠ”λ‹€. μ΄νŽ™ν‹°λΈŒ νƒ€μž…μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” 'μž‰μ—¬ 속성 체크'라고 함.

 

λͺ¨λ“  object literal은 μ΄ˆκΈ°μ— “fresh” ν•˜λ‹€κ³  κ°„μ£Όλ˜λ©°, νƒ€μž… 단언 (type assertion) 을 ν•˜κ±°λ‚˜, νƒ€μž… 좔둠에 μ˜ν•΄ object literal의 νƒ€μž…μ΄ ν™•μž₯되면 “freshness”κ°€ μ‚¬λΌμ§€κ²Œ λ©λ‹ˆλ‹€. νŠΉμ •ν•œ λ³€μˆ˜μ— object literal을 ν• λ‹Ήν•˜λŠ” 경우 이 2가지 쀑 ν•œκ°€μ§€κ°€ λ°œμƒν•˜κ²Œ λ˜λ―€λ‘œ “freshness”κ°€ μ‚¬λΌμ§€κ²Œ 되며, ν•¨μˆ˜μ— 인자둜 object literal을 λ°”λ‘œ μ „λ‹¬ν•˜λŠ” κ²½μš°μ—λŠ” “fresh”ν•œ μƒνƒœλ‘œ μ „λ‹¬λ©λ‹ˆλ‹€.

https://toss.tech/article/typescript-type-compatibility

 

freshν•œ 객체 λ¦¬ν„°λŸ΄μ„ λ³€μˆ˜μ— ν• λ‹Ήν•˜μ§€ μ•Šκ³  λ°”λ‘œ μ‚¬μš©ν•œλ‹€λ©΄, μ–΄μ°¨ν”Ό ν•΄λ‹Ή ν•¨μˆ˜μ—μ„œλ§Œ μ‚¬μš©λ˜κ³  λ‹€λ₯Έ κ³³μ—μ„œ μ‚¬μš©λ˜μ§€ μ•ŠλŠ”λ‹€. 이 κ²½μš°μ—λŠ” μœ μ—°ν•¨μ— λŒ€ν•œ μ΄μ λ³΄λ‹€λŠ” λΆ€μž‘μš©μ„ λ°œμƒμ‹œν‚¬ κ°€λŠ₯성이 λ††μœΌλ―€λ‘œ ꡳ이 ꡬ쑰적 타이핑을 지원해야 ν•  μ΄μœ κ°€ μ—†λ‹€.

 

μ •λ¦¬ν•˜μžλ©΄, 객체 λ¦¬ν„°λŸ΄μ„ λ³€μˆ˜μ— ν• λ‹Ήν•˜κ±°λ‚˜ ν•¨μˆ˜μ— λ§€κ°œλ³€μˆ˜λ‘œ 전달할 λ•Œ μž‰μ—¬ 속성 체크가 μˆ˜ν–‰λ˜λŠ” 것. λ”°λΌμ„œ νƒ€μž… ν˜Έν™˜μ„ ν—ˆμš©ν•˜μ§€ μ•ŠλŠ”λ‹€.

 

 

λΉ„μŠ·ν•œ νƒ€μž… 체크λ₯Ό μ§€μ›ν•˜λŠ” 경우

μ˜΅μ…”λ„ν•œ μ†μ„±λ§Œ κ°€μ§€λŠ” 'weak' νƒ€μž…λ„ λΉ„μŠ·ν•˜κ²Œ λ³„λ„μ˜ 체크λ₯Ό μˆ˜ν–‰ν•œλ‹€.

interface LineChartOptions {
    logscale?: boolean;
    invertedYAxis?: boolean;
    areaChart?: boolean;
}

ꡬ쑰적 타이핑 κ΄€μ μ—μ„œ LineChartOptions νƒ€μž…μ€ λͺ¨λ“  속성이 μ„ νƒμ μ΄λ―€λ‘œ λͺ¨λ“  객체λ₯Ό 포함할 수 μžˆλ‹€. μ•„λ¬΄κ±°λ‚˜ 넣어도 λ¬Έμ œκ°€ μ—†μ„κ±°λΌλŠ” 이야기이닀.

 

const opts = { logScale: true };
const o: LineChartOptions = opts; //였λ₯˜!!

ν•˜μ§€λ§Œ μœ„μ˜ μ½”λ“œμ—μ„  s 와 S 의 μ˜€νƒ€λŠ” μ²΄μ»€μ—μ„œ κ±ΈλŸ¬μ£ΌλŠ”κ²Œ νš¨κ³Όμ μ΄λ‹€. μ΄λŸ¬ν•œ μ²΄ν¬λŠ” μ—„κ²©ν•œ 객체 λ¦¬ν„°λŸ΄ 체크와 λ‹€λ₯΄κ²Œ λͺ¨λ“  ν• λ‹Ήλ¬Έλ§ˆλ‹€ μˆ˜ν–‰λœλ‹€. freshν•˜μ§€ μ•Šλ”λΌλ„.

 

객체 λ¦¬ν„°λŸ΄μ΄μ§€λ§Œ μž‰μ—¬ 속성 체크λ₯Ό ν•˜μ§€ μ•ŠλŠ” 경우

별것도 μ•„λ‹Œλ° μ˜ˆμ™Έκ°€ μžˆλ‹€κ΅¬μš”.

 

1. νƒ€μž… 선언이 μ•„λ‹Œ νƒ€μž… 단언을 ν–ˆμ„ λ•Œ

interface Options {
    title: string;
    darkMode?: boolean;
}

const o = {darkmode: true, title: 'Ski Free'} as Options //정상

μœ„μ—μ„œ 봀던 μ˜ˆμ‹œλ₯Ό λ‹€μ‹œ κ°€μ Έμ™”λ‹€. 객체 λ¦¬ν„°λŸ΄μ„ λ³€μˆ˜μ— λ°”λ‘œ ν• λ‹Ήν–ˆκΈ° λ•Œλ¬Έμ— μž‰μ—¬ 속성 체크λ₯Ό ν•΄μ•Όν•  것 κ°™μ§€λ§Œ, νƒ€μž… 단언문을 μ‚¬μš©ν–ˆμ„ 땐 μ μš©λ˜μ§€ μ•ŠλŠ”λ‹€.

 

2. 인덱슀 μ‹œκ·Έλ‹ˆμ²˜λ₯Ό μ‚¬μš©ν–ˆμ„ λ•Œ

interface Options {
    darkMode?: boolean;
    [otherOptions: string]: unknown;
}

const o: Options = {darkmode: true}; //정상

인덱슀 μ‹œκ·Έλ‹ˆμ²˜λ₯Ό μ‚¬μš©ν•˜λ©΄ νƒ€μž…μŠ€ν¬λ¦½νŠΈκ°€ 좔가적인 속성을 μ˜ˆμƒν•˜λ„λ‘ ν•  수 μžˆλ‹€.

ν•˜μ§€λ§Œ μ›¬λ§Œν•˜λ©΄ 쓰지 λ§ˆμ…ˆ.

 


 

μ •λ¦¬ν•˜μžλ©΄ 이렇닀.

  • TypeSciptλŠ” ꡬ쑰적으둜 νƒ€μž… ν˜Έν™˜μ„±μ΄ μžˆλŠ” 객체 λ¦¬ν„°λŸ΄μ˜ νƒ€μž… 검사λ₯Ό μ‰½κ²Œ ν•  수 μžˆλ„λ‘ 신선도(Freshness)λΌλŠ” κ°œλ…μ„ μ œκ³΅ν•œλ‹€.
  • 객체 λ¦¬ν„°λŸ΄μ„ λ³€μˆ˜μ— ν• λ‹Ήν•˜κ±°λ‚˜ ν•¨μˆ˜μ— λ§€κ°œλ³€μˆ˜λ‘œ 전달할 λ•Œ μž‰μ—¬ 속성 체크가 μˆ˜ν–‰λœλ‹€.
  • μž„μ‹œ λ³€μˆ˜ 이용, 인덱슀 μ‹œκ·Έλ‹ˆμ²˜ λ“±μœΌλ‘œ μž‰μ—¬ 속성 체크λ₯Ό κ±΄λ„ˆλ›Έ 수 μžˆλ‹€.