woowacourse-study / 2022-thanks-giving-effective-typescript

πŸ‚μΆ”μ„ μ—°νœ΄ μ§‘μ€‘πŸ‚ μ΄νŽ™ν‹°λΈŒ νƒ€μž…μŠ€ν¬λ¦½νŠΈλ₯Ό μ½λŠ” λͺ¨μž„ (βœŒοΈμ™„μ£Όμ™„λ£ŒβœŒοΈ)
6 stars 0 forks source link

2022.09.04 #1

Closed moonheekim0118 closed 2 years ago

moonheekim0118 commented 2 years ago

μ•„μ’Œμž£!!!!!!!!πŸ’ͺπŸ’šπŸ’›πŸ§‘β€οΈπŸ’œπŸ’™

prefer2 commented 2 years ago

1μž₯: νƒ€μž…μŠ€ν¬λ¦½νŠΈ μ•Œμ•„λ³΄κΈ°

νƒ€μž…μŠ€ν¬λ¦½νŠΈμ˜ λͺ©ν‘œ 쀑 ν•˜λ‚˜λŠ” λŸ°νƒ€μž„μ— 였λ₯˜λ₯Ό λ°œμƒμ‹œν‚¬ μ½”λ“œλ₯Ό 미리 μ°Ύμ•„λ‚΄λŠ” 것.

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

ts.config 파일, tsc β€” init으둜 섀정을 ν•΄μ€€λ‹€

μ½”λ“œ 생성과 νƒ€μž…μ΄ κ΄€κ³„μ—†μŒμ„ μ΄ν•΄ν•˜κΈ°

νƒ€μž…μŠ€ν¬λ¦½νŠΈ 컴파일러

μ»΄νŒŒμΌμ€ νƒ€μž… 체크와 λ…λ¦½μ μœΌλ‘œ λ™μž‘ν•˜κΈ° λ•Œλ¬Έμ—, νƒ€μž… 였λ₯˜κ°€ μžˆλŠ” μ½”λ“œλ„ 컴파일이 κ°€λŠ₯ν•˜λ‹€

λŸ°νƒ€μž„μ—λŠ” νƒ€μž… 체크가 λΆˆκ°€λŠ₯ν•˜λ‹€

%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2022-09-03_%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE_8 57 43

instanceof μ²΄ν¬λŠ” λŸ°νƒ€μž„μ— μΌμ–΄λ‚˜μ§€λ§Œ, Rectangle은 νƒ€μž…μ΄λΌ λŸ°νƒ€μž„ μ‹œμ μ— μ•„λ¬΄λŸ° 역할을 ν•  수 μ—†λ‹€.

ν•΄κ²° 방법

ꡬ쑰적 타이핑에 μ΅μˆ™ν•΄μ§€κΈ°

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 덕 타이핑 κΈ°λ°˜μ΄λ‹€. νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” 이λ₯Ό λͺ¨λΈλ§ν•˜κΈ° μœ„ν•΄ ꡬ쑰적 타이핑을 μ‚¬μš©ν•œλ‹€.

interface Vector2D {
  x: number;
  y: number;
}

interface NamedVector {
  name: string;
  x: number;
  y: number;
}

function calculateLength(v: Vector2D){
  return Math.sqrt(v.x * v.x + v.y * v.y)
}

const v: NamedVector = { x:3, y:4, name:'name' };
console.log(calculateLength(v));

λ‹€μŒ μ½”λ“œλŠ” λ¬Έμ œκ°€ λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€. NamedVector의 ꡬ쑰가 Vector2D와 ν˜Έν™˜λœλ‹€. μ—¬κΈ°μ„œ ꡬ쑰적 νƒ€μ΄ν•‘μ΄λΌλŠ” μš©μ–΄κ°€ μ‚¬μš©λœλ‹€.

interface Vector2D {
  x: number;
  y: number;
}

interface Vector3D {
  x: number;
  y: number;
  z: number;
}

function calculateLength(v: Vector2D){
  return Math.sqrt(v.x * v.x + v.y * v.y)
}

function normalize(v: Vector3D){
  const length = calculateLength(v);

  return {
    x: v.x / length,
    y: v.y / length,
    z: v.z / length,
  }
}

λ‹€μŒκ³Ό 같은 μ½”λ“œμ—μ„œλŠ” λ²„κ·Έλ‘œ 인해 normalizeκ°€ 3D 벑터λ₯Ό 기반으둜 μ—°μ‚°λœλ‹€. ꡬ쑰적 타이핑에 μžˆμ–΄μ„œ Vector2D와 ν˜Έν™˜λ˜κΈ° λ•Œλ¬Έμ΄λ‹€. ν•¨μˆ˜λ₯Ό μž‘μ„±ν•  λ•Œ λ§€κ°œλ³€μˆ˜λ“€μ˜ 속성듀이 λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž…μ— μ„ μ–Έλœ μ†μ„±λ§Œμ„ κ°€μ§€κΈ°λ§Œ μƒκ°ν•˜κΈ° 쉽닀(이λ₯Ό sealed, precise νƒ€μž…μ΄λΌκ³  λΆ€λ₯Έλ‹€) νƒ€μž…μŠ€ν¬λ¦½νŠΈ νƒ€μž… μ‹œμŠ€ν…œμ€ 이λ₯Ό ν‘œν˜„ν•  수 μ—†μœΌλ©° μ—΄λ €(open)μžˆλ‹€.

클래슀 λ˜ν•œ ꡬ쑰적 타이핑 κ·œμΉ™μ„ λ”°λ₯Έλ‹€.

라이브러리 κ°„μ˜ μ˜μ‘΄μ„±μ„ 뢄리할 수 μžˆλ‹€.

any νƒ€μž… μ§€μ–‘ν•˜κΈ°

moonheekim0118 commented 2 years ago

νƒ€μž…μŠ€ν¬λ¦½νŠΈμ™€ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 관계

νƒ€μž…μŠ€ν¬λ¦½νŠΈλ₯Ό μ‚¬μš©ν•˜λŠ” 이유

μ½”λ“œ 생성과 νƒ€μž…μ΄ 관계 μ—†μŒμ„ μ΄ν•΄ν•˜κΈ°

if(shape instanceof Rectangle) // 였λ₯˜!

- νƒ€μž…μ€ λŸ°νƒ€μž„ μ‹œμ μ— μ•„λ¬΄λŸ° 역할을 ν•  수 μ—†λ‹€.
- νƒ€μž…μŠ€ν¬λ¦½νŠΈμ˜ νƒ€μž…μ€ 제거 κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ—, μ‹€μ œλ‘œ μžλ°”μŠ€ν¬λ¦½νŠΈλ‘œ 컴파일 λ˜λŠ” κ³Όμ •μ—μ„œ λͺ¨λ“  μΈν„°νŽ˜μ΄μŠ€, νƒ€μž…, νƒ€μž… ꡬ문은 κ·Έλƒ₯ μ œκ±°λ˜μ–΄ 버린닀.

### λŸ°νƒ€μž„ νƒ€μž…μ€ μ„ μ–Έλœ νƒ€μž…κ³Ό λ‹€λ₯Ό 수 μžˆλ‹€.
- μ–΄λŠκ²½μš°? API 호좜둜 λ°›μ•„μ˜¨ κ°’μ˜ 경우

## ꡬ쑰적 타이핑

```ts

interface Vector2D{
   x:number;
   y:number;
}

interface Vector3D{
   x:number;
   y:number;
   z:number;
}

function calculateLength(v: Vector2D) {
   return Math.sqrt(v.x * v.x + v.y * v.y);
}

λ΄‰μΈλœ, μ •ν™•ν•œ νƒ€μž…

any νƒ€μž… μ§€μ–‘ν•˜κΈ°

  1. any νƒ€μž…μ€ μ•ˆμ •μ„±μ΄ μ—†λ‹€.
  2. anyλŠ” ν•¨μˆ˜ μ‹œκ·Έλ„ˆμ³λ₯Ό λ¬΄μ‹œν•΄λ²„λ¦°λ‹€.
  3. any λŠ” μ–Έμ–΄ μ„œλΉ„μŠ€κ°€ μ μš©λ˜μ§€ μ•ŠλŠ”λ‹€.
  4. any λŠ” μ½”λ“œ λ¦¬νŒ©ν„°λ§ λ•Œ 버그λ₯Ό κ°μΆ˜λ‹€.
  5. any λŠ” νƒ€μž… 섀계λ₯Ό κ°μΆ˜λ‹€.
  6. any λŠ” νƒ€μž…μ‹œμŠ€ν…œμ˜ 신뒰도λ₯Ό λ–¨μ–΄λœ¨λ¦°λ‹€.
liswktjs commented 2 years ago

νƒ€μž…μŠ€ν¬λ¦½νŠΈμ™€ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 관계 μ΄ν•΄ν•˜κΈ°

νƒ€μž…μŠ€ν¬λ¦½νŠΈ μ„€μ • μ΄ν•΄ν•˜κΈ°

μ½”λ“œ 생성과 νƒ€μž…μ΄ κ΄€κ³„μ—†μŒμ„ μ΄ν•΄ν•˜κΈ°

ꡬ쑰적 타이핑에 μ΅μˆ™ν•΄μ§€κΈ°

any νƒ€μž… μ§€μ–‘ν•˜κΈ°

soyi47 commented 2 years ago

μ•„μ΄ν…œ 1. νƒ€μž…μŠ€ν¬λ¦½νŠΈμ™€ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 관계 μ΄ν•΄ν•˜κΈ°

μ•„μ΄ν…œ 2. νƒ€μž…μŠ€ν¬λ¦½νŠΈ μ„€μ • μ΄ν•΄ν•˜κΈ°

μ•„μ΄ν…œ 3. μ½”λ“œ 생성과 νƒ€μž…μ΄ κ΄€κ³„μ—†μŒμ„ μ΄ν•΄ν•˜κΈ°

μ•„μ΄ν…œ 4. ꡬ쑰적 타이핑에 μ΅μˆ™ν•΄μ§€κΈ°

μ•„μ΄ν…œ 5. any νƒ€μž… μ§€μ–‘ν•˜κΈ°