πŸͺ„ λŸ¬λ‹ νƒ€μž…μŠ€ν¬λ¦½νŠΈ CH4 - 객체

λ°•λ―Όμš°Β·2023λ…„ 10μ›” 26일
0

πŸͺ„ TypeScript

λͺ©λ‘ 보기
3/4
post-thumbnail

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

객체 νƒ€μž…μ€ 객체 λ¦¬ν„°λŸ΄κ³Ό μœ μ‚¬ν•˜κ²Œ λ³΄μ΄μ§€λ§Œ ν•„λ“œ κ°’ λŒ€μ‹  νƒ€μž…μ„ μ‚¬μš©ν•œλ‹€.

let poetLater: {
    born: number;
    name: string;
}

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

πŸ“Œ 별칭 객체 νƒ€μž…

각 객체 νƒ€μž…μ„ 계속 μž‘μ„±ν•˜μ§€ μ•Šκ³ , 각 객체 νƒ€μž…μ— νƒ€μž… 별칭을 ν• λ‹Ήν•˜λŠ” 방법이 더 μΌλ°˜μ μ΄λ‹€.

type Poet = {
    born: number;
    name: string;
}

let poetLater: Poet;

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

ꡬ쑰적 타이핑

νƒ€μž…μ„ μΆ©μ‘±ν•˜λŠ” λͺ¨λ“  값을 ν•΄λ‹Ή κ°’μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλ‹€ ?

hasBoth λ©€λ²„λŠ” λͺ…μ‹œμ μœΌλ‘œ μ„ μ–Έλ˜μ§€ μ•Šμ•˜μŒμ—λ„ 두 개의 별칭 객체 νƒ€μž…μ„ λͺ¨λ‘ κ°€μ§€λ―€λ‘œ 두 개의 별칭 객체 νƒ€μž… 내에 μ„ μ–Έλœ λ³€μˆ˜λ₯Ό λͺ¨λ‘ μ œκ³΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€.


초과 속성 검사

이해 μ•ˆλ¨ => λ‚˜μ€‘μ— λ‹€μ‹œ 읽어보기


πŸ“Œ 객체 νƒ€μž… μœ λ‹ˆμ–Έ

μœ μΆ”λœ 객체 νƒ€μž… μœ λ‹ˆμ–Έ

λ³€μˆ˜μ— μ—¬λŸ¬ 객체 νƒ€μž… 쀑 ν•˜λ‚˜κ°€ 될 수 μžˆλŠ” μ΄ˆκΉƒκ°’μ΄ 주어지면 TSλŠ” ν•΄λ‹Ή νƒ€μž…μ„ 객체 νƒ€μž… μœ λ‹ˆμ–ΈμœΌλ‘œ μœ μΆ”ν•œλ‹€.

const poem = Math.random > 0.5 
	? { name: "MinwooP", pages: 7 }
	: { name: "MinwooP", rhymes: true };

μœ„μ˜ poem λ³€μˆ˜λŠ” μ•„λž˜μ™€ 같은 객체 νƒ€μž… μœ λ‹ˆμ–ΈμœΌλ‘œ μœ μΆ”λœλ‹€.

{
    name: string,
    pages: number,
    ryhmes?: undefined
}
| 
{
    name: string,
    pages?: undefined,
    ryhmes: boolean
}

λͺ…μ‹œλœ 객체 νƒ€μž… μœ λ‹ˆμ–Έ

type PoemWithPages = {
    name: string,
    pages: number
}

type PoemWithRhymes = {
    name: string,
    ryhmes: boolean
}

type Poem = PoemWithPages | PoemWithRhymes;

const poem: Poem = Math.random > 0.5 
	? { name: "MinwooP", pages: 7 }
	: { name: "MinwooP", rhymes: true };

poem.name; // ok

poem.pages // error
poem.rhymes // error

poem.pagesλ‚˜ poem.rhymes 처럼 잠재적으둜 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 객체의 멀버에 λŒ€ν•œ 접근을 μ œν•œν•œλ‹€. pagesλ‚˜ rhymesλŠ” 항상 μ‘΄μž¬ν•œλ‹€λŠ” 보μž₯이 μ—†κΈ° λ•Œλ¬Έ.


if문을 톡해 객체 νƒ€μž… λ‚΄λ‘œμž‰μ„ ν•  수 있고, 이λ₯Ό 톡해 νŠΉμ • 속성에 μ ‘κ·Όν•  수 μžˆλ‹€.

if("pages" in poem){ // poem은 PoemWithPages둜 μ’ν˜€μ§
    poem.pages; 
}else{ // poem은 PoemWithRhymes둜 μ’ν˜€μ§
    poem.rhymes;
}

νŒλ³„λœ μœ λ‹ˆμ–Έ

μœ λ‹ˆμ˜¨ νƒ€μž…μ„ κ΅¬μ„±ν•˜λŠ” νƒ€μž…λ“€μ˜ κ³΅ν†΅λœ "λ¦¬ν„°λŸ΄ νƒ€μž…" ν•„λ“œλ₯Ό ν†΅ν•΄μ„œ κ΅¬λΆ„ν•˜λŠ”κ²ƒ

type PoemWithPages = {
    type: 'pages'; // λ¦¬ν„°λŸ΄ νƒ€μž… ? 
}

λ‹€μŒκ³Ό 같이 객체의 속성에 type ν•„λ“œλ₯Ό μΆ”κ°€ν•˜κ³  κ·Έ 속성 값에 typeλͺ…을 λ‚˜νƒ€λ‚Ό 수 μžˆλ‹€.

type PomeWithPages = {
    name: string;
    number: number
    type: 'pages';
}

type PoemWithRhymes = {
    name: string;
    rhymes: boolean;
    type: 'rhymes';
}

type Poem = PoemWithPages | PoemWithRhymes;

const poem: Poem = Math.random > 0.5 
	? { name: "MinwooP", pages: 7, type: "pages" }
	: { name: "MinwooP", rhymes: true, type: "rhymes" };

if(poem.type === "pages"){
   // pages νƒ€μž…
}else{
   // rhymes νƒ€μž…  
}

switch case 문을 ν†΅ν•΄μ„œλ„ 각 type을 ꡬ뢄할 수 μžˆλ‹€.

switch(poem.type){
    case "pages": 
        // ~ 
        break;	
    case "rhymes": 
        // ~ 
        break;
}

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

μ—¬λŸ¬ κΈ°μ‘΄ 객체 νƒ€μž…μ„ 별칭 객체 νƒ€μž…μœΌλ‘œ κ²°ν•©ν•΄ μƒˆλ‘œμš΄ νƒ€μž…μ„ 생성할 수 μžˆλ‹€.


μœ λ‹ˆμ–Έ νƒ€μž…κ³Ό κ²°ν•©ν•΄ μ‚¬μš©ν•  μˆ˜λ„ μžˆλ‹€.

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

μœ„μ˜ ShortPoem νƒ€μž…μ€ 항상 author 속성을 가지며 ν•˜λ‚˜μ˜ type μ†μ„±μœΌλ‘œ νŒλ³„λœ μœ λ‹ˆμ–Έ νƒ€μž…μ΄λ‹€.


tsκ°€ ν•΄λ‹Ή 이름을 좜λ ₯ν•˜λ„λ‘(ν• λ‹Ή κ°€λŠ₯μ„± 였λ₯˜ λ•Œ νƒ€μž… 검사기가 좜λ ₯ν•˜λŠ” λ©”μ‹œμ§€) νƒ€μž…μ„ 일련의 λ³„μΉ­μœΌλ‘œ 된 객체 νƒ€μž…μœΌλ‘œ λΆ„ν• ν•˜λ©΄ 읽기가 훨씬 μ‰¬μ›Œμ§„λ‹€.

type ShortPoemBase = { author: string };
type Haiku = ShortPoemBase & { kigo: string; type: "haiku"; }
type Villanelle = { metor: number; type: "villanelle"};
type ShortPoem = Haiku | Villanelle;

두 개의 μ›μ‹œ νƒ€μž…μ„ ꡐ차 μ‹œλ„ν•˜λ©΄ never ν‚€μ›Œλ“œλ‘œ ν‘œμ‹œλ˜λŠ” never νƒ€μž…μ΄ λœλ‹€.

profile
κΎΈμ€€νžˆ, 깊게

0개의 λŒ“κΈ€