객체 νƒ€μž…

πŸ“„ 객체 νƒ€μž…

객체 νƒ€μž…μ΄λž€ νƒ€μž…μŠ€ν¬λ¦½νŠΈμ—μ„œ {속성λͺ…: νƒ€μž… λͺ…}ν˜•μ‹μœΌλ‘œ 이루어진 νƒ€μž…μž…λ‹ˆλ‹€.

type Poet = {
  // 별칭 객체 νƒ€μž…
  born: number;
  name: string;
};

let poetLater: Poet;

poetLater = {
  born: 1935,
  name: "Mary Oliver",
};

poetLater = "Sappho";
// Error: Type 'string' is not assignable to type '{born: numner; name: string;}

πŸ“„ ꡬ쑰적 타이핑

ꡬ쑰적 타이핑은 μ‹€μ œ ꡬ쑰와 μ •μ˜μ— μ˜ν•΄ κ²°μ •λ˜λŠ” νƒ€μž… μ‹œμŠ€ν…œμž…λ‹ˆλ‹€.

λŸ°νƒ€μž„μ— νƒ€μž…μ„ κ²°μ •ν•˜λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 덕 타이핑과 달리, νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” ꡬ쑰적으둜 νƒ€μž…ν™”ν•©λ‹ˆλ‹€.

덕 νƒ€μ΄ν•‘μ΄λž€? 동적 νƒ€μ΄ν•‘μ˜ ν•œ μ’…λ₯˜λ‘œ 객체의 λ³€μˆ˜ 및 λ©”μ„œλ“œμ˜ 집합이 객체의 νƒ€μž…μ„ κ²°μ •ν•˜λŠ” 것

β–ͺ 초과 속성 검사

초과 속성 κ²€μ‚¬λŠ” 객체 νƒ€μž… 속성을 κ²€μ‚¬ν•˜λŠ” κ³Όμ •μž…λ‹ˆλ‹€.

초과 속성 κ²€μ‚¬μ—λŠ” μ€‘μš”ν•œ 쑰건이 μžˆμŠ΅λ‹ˆλ‹€.

β€œκ°μ²΄ λ¦¬ν„°λŸ΄μ„ λ³€μˆ˜μ— 집적 ν• λ‹Ήν•˜λŠ” κ²½μš°μ—λ§Œβ€μ΄ˆκ³Ό 속성 검사가 μ§„ν–‰λœλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

λ‹€μŒκ³Ό 같은 μ˜ˆμ‹œμ—μ„œλŠ” 객체 λ¦¬ν„°λŸ΄ Poet을 λ³€μˆ˜ extraPerson에 직접 ν• λ‹Ήν–ˆκΈ° λ•Œλ¬Έμ— 초과 속성 검사가 μ§„ν–‰λ˜μ–΄ νƒ€μž… μ—λŸ¬λ₯Ό λ±‰μŠ΅λ‹ˆλ‹€.

type Person = {
  name: string,
  age: number,
};

// ok. Personν•„λ“œμ™€ 일치
const Sujin: Person = {
  name: "sujin",
  age: 28,
};

const extraPerson: Person = {
  name: "sujin",
  age: 28,
  nickName: "masuri", // Error!
};

μ΄λ²ˆμ—λŠ” 쀑간에 λ³€μˆ˜λ₯Ό κ±°μ³μ„œ κ°μ²΄λ¦¬ν„°λŸ΄λ₯Ό λŒ€μž…ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

const exisitingObject = {
  name: "sujin",
  age: 28,
  nickName: "masuri",
};

const extraPerson: Person = existingObject; // ok

객체λ₯Ό λ‹€λ₯Έ λ³€μˆ˜μ— ν• λ‹Ήν–ˆλ”λ‹ˆ, λ³€μˆ˜ existingObjectλŠ” 초과 속성 검사λ₯Ό 받지 μ•Šμ•˜κΈ° λ•Œλ¬Έμ— μ—λŸ¬κ°€ λ°œμƒν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

β–ͺ 선택적 속성

선택적 속성은 μ—λ„ˆν…Œμ΄μ…˜(:)μ•žμ— ?λ₯Ό μΆ”κ°€ν•΄μ„œ μ„ νƒμ μœΌλ‘œ 속성을 ν—ˆμš©ν•  λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.

νƒ€μž…μ„ undefined둜 μ„ μ–Έν•œκ²½μš°, κ·Έ 값이 undefined일지라도 λ°˜λ“œμ‹œ κ·Έ 값이 μ‘΄μž¬ν•΄μ•Όν•©λ‹ˆλ‹€.

반면, μ„ νƒμ μœΌλ‘œ μ„ μ–Έλœ 속성은 μ‘΄μž¬ν•˜μ§€ μ•Šμ•„λ„ λ©λ‹ˆλ‹€.

type Writer = {
  author: string | undefined;
  editor?: string;
};

const hasRequired: Writer = {
  author: undefined;
}

const missingRequired: Writer = {};
// Error: Property 'author' is missing in type '{}' but required in type 'Writers'.

πŸ“„ ꡐ차 νƒ€μž…

ꡐ차 νƒ€μž…μ€ ν•©μ§‘ν•©μ˜ κ°œλ…μœΌλ‘œ 이해할 수 μžˆμŠ΅λ‹ˆλ‹€.

μœ λ‹ˆμ–Έ νƒ€μž…μ΄ 이거 λ˜λŠ” μ €κ±°μ˜ κ°œλ…μœΌλ‘œ 주어진 νƒ€μž… 쀑 ν•˜λ‚˜μ˜ νƒ€μž…λ§Œ μ„ νƒν•˜κ²Œ λ˜λŠ” λ°˜λ©΄μ—,

ꡐ차 νƒ€μž…μ€ μ„œλ‘œ λ‹€λ₯Έ νƒ€μž…μ΄ ν•˜λ‚˜μ˜ νƒ€μž…μœΌλ‘œ λ§Œλ“€μ–΄μ Έ μ—¬λŸ¬ νƒ€μž…μ„ λ™μ‹œμ— λ‚˜νƒ€λ‚Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

ꡐ차 νƒ€μž…μ€ μœ λ‹ˆμ–Έ νƒ€μž…κ³Ό κ²°ν•©ν•˜μ—¬ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

type ShortPoem = {
  author: string;
} & ({ kigo: string; type: "haiku" } | { meter: number; type: "villanelle" });

// type:
// {author: string;  kigo: string; type: "haiku"}
// λ˜λŠ”
// {author: string; meter: number; type: "villanelle" }

β–ͺ never

μ›μ‹œνƒ€μž…μ— κ΅μ°¨νƒ€μž…μ„ μ μš©ν•˜λŠ” 것은 λ¬΄μ˜λ―Έν•œ μΌμž…λ‹ˆλ‹€.

μ›μ‹œνƒ€μž…μ— κ΅μ°¨νƒ€μž…μ„ μ μš©ν•˜λ©΄ neverλΌλŠ” νƒ€μž…μ΄ λ˜λŠ”λ°, μ΄λŠ” λΉ„μ–΄μžˆλŠ” νƒ€μž…μ„ λœ»ν•©λ‹ˆλ‹€.

let notNumber: number & string = 0;
// Error: Type 'number'is not assignable to type 'never'

μ°Έκ³ 

Leave a comment