TS: ํ•œ์ž…ํฌ๊ธฐ๋กœ ์ž˜๋ผ๋จน๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ฑŒ๋ฆฐ์ง€_day6

2024. 8. 9. 00:50ยทlecture recap

๐ŸฅŠ ์ง„๋„

 

3. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ดํ•ดํ•˜๊ธฐ (9/9)

  • ํƒ€์ž… ๋‹จ์–ธ
  • ํƒ€์ž… ์ขํžˆ๊ธฐ
  • ์„œ๋กœ์†Œ ์œ ๋‹ˆ์˜จ ํƒ€์ž…

๐Ÿฅ‹ ์š”์•ฝ

 

ํƒ€์ž… ๋‹จ์–ธ (Type Assertion)

// ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ๋ˆˆ์„ ์ž ๊น ๊ฐ€๋ ค์„œ ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ํƒ€์ž…์ด๋ผ๊ณ  ๋ฏฟ๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์œ„ํ—˜ํ•  ์ˆ˜ ์žˆ๋‹ค

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

let person = {} as Person;
person.name = "Julie";
person.age = 24;

type Dog = {
    name: string;
    color: string;
};

let dog = {
    name: "kimbab",
    color: "white",
    breed: "jindo",
} as Dog;

/**
 *  ํƒ€์ž… ๋‹จ์–ธ์˜ ๊ทœ์น™
 * ๋‹จ์–ธ์‹ : """   ๊ฐ’ as ๋‹จ์–ธ   """"
 * A as B
 * -> A๊ฐ€ B์˜ ์Šˆํผ ํƒ€์ž…์ด๊ฑฐ๋‚˜
 * -> A๊ฐ€ B์˜ ์„œ๋ธŒ ํƒ€์ž…์ด์–ด์•ผ ํ•จ.
 *
 */

let num1 = 10 as never;
let num2 = 10 as unknown as string;

   

  • const ๋‹จ์–ธ
let num4 = 10 as const;

let cat = {
    name: "์•ผ์˜น์ด",
    color: "yellow",
} as const;

// cat.name = "";
//  --> cannot assign to 'name' because it is a readonly property.
// const ์„ ์–ธ์œผ๋กœ readonly ํ”„๋กœํผํ‹ฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ

 

  • Non Null ๋‹จ์–ธ
type Post = {
    title: string;
    author?: string;
}

let post: Post = {
    title: "๊ฒŒ์‹œ๊ธ€",
    author: "์™•์ง€์€",
}

const len: number = post.author!.length;
// const len:number = post.author?.length;
// --> ?๋กœ ์ธํ•ด optional chaining์ด ์ผ์–ด๋‚˜๋Š”๋ฐ, type 'number | undefined' ์ผ ๊ฒฝ์šฐ number ์ „์šฉ ๋ฉ”์†Œ๋“œ length๋ฅผ undefined์ผ ์ˆ˜๋„ ์žˆ๋Š” ๋ณ€์ˆ˜์— ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์˜๋ฏธ
// ! ๋กœ ํ™•์–ธ์„ ์ค˜์•ผํ•œ๋‹ค. !์‚ฌ์šฉ์‹œ ์ด๊ฑด null์ด๋‚˜ undefined๊ฐ€ ์ ˆ๋Œ€ ์•„๋‹ˆ๊ณ  ๊ฐ’์ด ์žˆ๋‹ค๋Š” ๋‹จ์–ธ์„ ํ•˜๋Š” ๊ฒƒ

 

ํƒ€์ž… ์ขํžˆ๊ธฐ (Type Narrowing)

/**
 * ์กฐ๊ฑด๋ฌธ ๋“ฑ์„ ์ด์šฉํ•ด ๋„“์€ ํƒ€์ž… -> ์ข์€ ํƒ€์ž…์œผ๋กœ ์ขํž˜
 * ํƒ€์ž…์„ ์ƒํ™ฉ์— ๋”ฐ๋ผ ์ขํžˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ด์•ผ๊ธฐ ํ•  ๊ฒƒ
 */

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

// value => number : toFixed
// value => string : toUpperCase
// value => Date : getTime
// value => Person : name์€ age์‚ด ์ž…๋‹ˆ๋‹ค.

function func(value: number | string | Date | null | Person) {
// if์™€ typeof์ฒ˜๋Ÿผ type narrowing ํ•ด์ฃผ๋Š” ํ‘œํ˜„์‹์„ Type Guard๋ผ๊ณ  ํ•จ
    if (typeof value === "number") {
        console.log(value.toFixed());
    } else if (typeof value === "string") {
        console.log(value.toUpperCase());
    } else if (value instanceof Date) {
        console.log(value.getTime());
    } else if (value && "age" in value) {
        console.log(`${value.name}์€ ${value.age}์‚ด ์ž…๋‹ˆ๋‹ค.`);
    }
}
// if 
// typeof
// instanceof
// in

 

์„œ๋กœ์†Œ ์œ ๋‹ˆ์˜จ ํƒ€์ž…

/**
 * ๊ต์ง‘ํ•ฉ์ด ์—†๋Š” ํƒ€์ž…๋“ค๋กœ๋งŒ ๋งŒ๋“  ์œ ๋‹ˆ์˜จ ํƒ€์ž…
 */

type Admin = {
    tag: "ADMIN";
    name: string;
    kickCount: number;
};

type Member = {
    tag: "MEMBER";
    name: string;
    point: number;
};

type Guest = {
    tag: "GUEST";
    name: string;
    visitCount: number;
};

type User = Admin | Member | Guest;
// tag์˜ ํƒ€์ž…์„ string literal type์œผ๋กœ ๋งŒ๋“ค์–ด์คŒ์œผ๋กœ์„œ ๊ต์ง‘ํ•ฉ์ด ์ ˆ๋Œ€ ๋˜์ง€ ์•Š๋Š” ๊ด€๊ณ„๊ฐ€ ๋˜๋ฏ€๋กœ Admin, Member, Guest๊ฐ€ ์„œ๋กœ์†Œ ๊ด€๊ณ„๊ฐ€ ๋œ๋‹ค

// Admin => {name}๋‹˜, ํ˜„์žฌ๊นŒ์ง€ {kickCount}๋ช… ๊ฐ•ํ‡ดํ•˜์˜€์Šต๋‹ˆ๋‹ค.
// Member => {name}๋‹˜, ํ˜„์žฌ๊นŒ์ง€ {point} ๋ชจ์•˜์Šต๋‹ˆ๋‹ค.
// Guest => {name}๋‹˜, ํ˜„์žฌ๊นŒ์ง€ {visitCount}๋ฒˆ ์˜ค์…จ์Šต๋‹ˆ๋‹ค.

function login(user: User) {
    switch (user.tag) {
        case "ADMIN": {
            console.log(
                `${user.name}๋‹˜, ํ˜„์žฌ๊นŒ์ง€ ${user.kickCount}๋ช… ๊น…ํ‡ดํ•˜์˜€์Šต๋‹ˆ๋‹ค.`
            );
            break;
        }
        case "MEMBER": {
            console.log(`${user.name}๋‹˜, ํ˜„์žฌ๊นŒ์ง€ ${user.point} ๋ชจ์•˜์Šต๋‹ˆ๋‹ค.`);
            break;
        }
        case "GUEST": {
            console.log(
                `${user.name}๋‹˜, ํ˜„์žฌ๊นŒ์ง€ ${user.visitCount}๋ฒˆ ์˜ค์…จ์Šต๋‹ˆ๋‹ค.`
            );
        }
    }
}

 

 

๐Ÿค ๊ณผ์ œ

 

Q1. ํƒ€์ž… ๋‹จ์–ธ์„ ์ด์šฉํ•ด person ๋ณ€์ˆ˜์— ๋นˆ ๊ฐ์ฒด๋ฅผ ํ• ๋‹นํ•˜์„ธ์š”.

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

let person: Person = {};

 

โžก๏ธ

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

let person = {} as Person;

 

 

Q2. ํƒ€์ž… ๋‹จ์–ธ์„ ์ด์šฉํ•ด ํ•จ์ˆ˜ ํ˜ธ์ถœ์—์„œ์˜ ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ•˜์„ธ์š”.

let value = 10;
giveMe10(value);

function giveMe10(value: 10) {
  return value;
}

โžก๏ธ

let value = 10 as const;
giveMe10(value);

function giveMe10(value: 10) {
  return value;
}

Quiz 3.

CompanyMember ํƒ€์ž…์„ Boss์™€ Employee์˜ ์„œ๋กœ์†Œ ์œ ๋‹ˆ์˜จ ํƒ€์ž…์œผ๋กœ ์ •์˜ํ•˜์„ธ์š”.

type Boss = {
  car: string;
};

type Employee = {
  salary: number;
};

type CompanyMember = Employee | Boss;

/* [Test] ์—ฌ๊ธฐ๋ถ€ํ„ฐ๋Š” ์ •๋‹ต์„ ์ฒดํฌํ•˜๊ธฐ ์œ„ํ•œ ์šฉ๋„๋กœ ์ˆ˜์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค */
function test(companyMember: CompanyMember) {
  if (companyMember.tag === "BOSS") {
    console.log("์‚ฌ์žฅ๋‹˜ ๋˜ ์ฐจ ๋ฐ”๊ฟจ๋‹ค : ", companyMember.car);
  } else if (companyMember.tag === "EMPLOYEE") {
    console.log("์•„์ง๋„ ์›”๊ธ‰์€ : ", companyMember.salary);
  }
}


โžก๏ธ

type Boss = {
  type: "Boss";
  car: string;
};

type Employee = {
  type: "Employee"
  salary: number;
};

type CompanyMember = Employee | Boss;

'lecture recap' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

TS: ํ•œ์ž…ํฌ๊ธฐ๋กœ ์ž˜๋ผ๋จน๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ฑŒ๋ฆฐ์ง€_day8  (0) 2024.08.09
TS: ํ•œ์ž…ํฌ๊ธฐ๋กœ ์ž˜๋ผ๋จน๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ฑŒ๋ฆฐ์ง€_day7  (0) 2024.08.09
TS: ํ•œ์ž…ํฌ๊ธฐ๋กœ ์ž˜๋ผ๋จน๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ฑŒ๋ฆฐ์ง€_day5  (1) 2024.08.09
TS: ํ•œ์ž…ํฌ๊ธฐ๋กœ ์ž˜๋ผ๋จน๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ฑŒ๋ฆฐ์ง€_day4  (0) 2024.08.09
TS: ํ•œ์ž…ํฌ๊ธฐ๋กœ ์ž˜๋ผ๋จน๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ฑŒ๋ฆฐ์ง€_day3  (0) 2024.07.26
'lecture recap' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • TS: ํ•œ์ž…ํฌ๊ธฐ๋กœ ์ž˜๋ผ๋จน๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ฑŒ๋ฆฐ์ง€_day8
  • TS: ํ•œ์ž…ํฌ๊ธฐ๋กœ ์ž˜๋ผ๋จน๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ฑŒ๋ฆฐ์ง€_day7
  • TS: ํ•œ์ž…ํฌ๊ธฐ๋กœ ์ž˜๋ผ๋จน๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ฑŒ๋ฆฐ์ง€_day5
  • TS: ํ•œ์ž…ํฌ๊ธฐ๋กœ ์ž˜๋ผ๋จน๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ฑŒ๋ฆฐ์ง€_day4
nuew
nuew
๐Ÿคธ ์žฌ์ฃผ ๋„˜๋Š” ์ค‘
  • nuew
    bloggg. . .๐Ÿฆ–๐Ÿ’ฅ
    nuew
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (88)
      • issue (10)
      • baekjoon (41)
      • lecture recap (11)
      • What I Learn (26)
      • retrospective (0)
      • maeil-mail (0)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ์ฝ”๋”ฉํ…Œ์ŠคํŠธ
    what i learn
    issue
    js
    modal
    TypeScript
    Node.js
    ๋ฐฑ์ค€
    ํ•œ์ž…ํฌ๊ธฐ๋กœ ์ž˜๋ผ๋จน๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ
    ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ
    Baekjoon
    JavaScript
    Study
    ์•Œ๊ณ ๋ฆฌ์ฆ˜
    zustand
    css
    media-query
    TailwindCSS
    ํ•œ์ž…ํฌ๊ธฐ๋กœ์ž˜๋ผ๋จน๋Š”ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ
    Algorithm
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
nuew
TS: ํ•œ์ž…ํฌ๊ธฐ๋กœ ์ž˜๋ผ๋จน๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ฑŒ๋ฆฐ์ง€_day6
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”