ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ์œ ํ‹ธ๋ฆฌํ‹ฐ ํƒ€์ž…(Utilty Types)
    โŒจ๏ธ conceptualization/Typescript 2022. 9. 12. 16:12
    728x90

     

    ๐Ÿ”ฅ typescript์—์„œ ๋‹ค์–‘ํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜๋Š” utility type์— ๋Œ€ํ•˜์—ฌ ์•Œ์•„๋ณด์ž

    1. keyof 
    2. Partial<T>
    3. Required<T>
    4. Readonly<T>
    5. Record<K,T>
    6. Pick<T,K>
    7. Omit<T,K>
    8. Exclude<T1,T2>
    9. NonNullable<Type>

     

     

    1. keyof ํƒ€์ž…

    ๐Ÿ‘‰๐Ÿป ๊ฐ์ฒด์˜ key ๊ฐ’์„ ์ถ”์ถœํ•œ๋‹ค
    interface User {
      id: number;
      name: string;
      age: number;
      gender: "m" | "f";
    }
    
    type UserKey = keyof User; 
    // ๐Ÿ“Œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ‚ค ๊ฐ’์„ ๋‚˜ํƒ€๋‚ธ๋‹ค
    // 'id' | 'name'| 'age'| 'gender'
    
    const uk: UserKey = "name";
    // ๐Ÿ“Œ name ๊ณผ ๊ฐ™์€ UserKey ํ”„๋กœํผํ‹ฐ ๊ฐ’์ด ๋“ค์–ด๊ฐ€์ง€ ์•Š์œผ๋ฉด error๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

     

     

     

    2. Partial

    ๐Ÿ‘‰๐Ÿป partial์€ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ชจ๋‘ ์˜ต์…˜์œผ๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.

    ์˜ˆ์‹œ๋น„๊ต

    interface User {
      id: number;
      name: string;
      age: number;
      gender: "m" | "f";
    }
    
    // ๐Ÿ“Œ User ํƒ€์ž…๋‚ด์˜ ํ”„๋กœํผํ‹ฐ ๊ฐ’์ด ์ผ๋ถ€๋งŒ ๋“ค์–ด๊ฐ”์Œ์œผ๋กœ error๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค
    let admin: User = {
        id: 1,
        name: "yelim",
    }

    โ“ ์ด๋Ÿด๋•Œ partial์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ•ด๋ณด์ž

    let admin: Partial<User> = {
      id: 1,
      name: "yelim",
    };
    
    // ๐Ÿ“Œ User ํƒ€์ž…์„ Partial<User> ์ฒ˜๋Ÿผ ๊ฐ์ŒŒ๋‹ค๋Š” ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜๋ฏธ์ด๋‹ค.
    
    // interface User {
    //   id?: number;
    //   name?: string;
    //   age?: number;
    //   gender?: "m" | "f";
    // }

     

     

     

    3. Required

    ๐Ÿ‘‰๐Ÿป (partial ์™€ ๋ฐ˜๋Œ€๊ฐœ๋…) ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ๋ฅผ ํ•„์ˆ˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.

    ์˜ˆ์‹œ๋น„๊ต

    interface User {
      id: number;
      name: string;
      age?: number; // ๐Ÿ“Œ age๋Š” optional ๊ฐ’์œผ๋กœ error๊ฐ€ ๋‚˜์ง€์•Š๋Š”๋‹ค.
    }
    
    let admin: User = {
      id: 1,
      name: "yelim",
    };
    • ํ•˜์ง€๋งŒ Required<User> ๋กœ ๊ฐ์‹ธ๊ฒŒ ๋œ๋‹ค๋ฉด ?
    interface User {
      id: number;
      name: string;
      age?: number; 
    }
    
    let admin: Required<User> = { // ๐Ÿ“Œ optional ๊ฐ’์ด์—ˆ๋˜ age ํ”„๋กœํผํ‹ฐ๊ฐ€ ํ•„์ˆ˜ ๊ฐ’์ด ๋˜๋ฉฐ error message๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
      id: 1,
      name: "yelim"
    };

     

     

     

     

    4. Readonly

    ๐Ÿ‘‰๐Ÿป ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.
    interface User {
      id: number;
      name: string;
      age?: number;
    }
    
    let admin: Readonly<User> = {
      id: 1,
      name: "yelim",
    };
    
    admin.id = 10; // ๐Ÿ“Œ ์ฝ๊ธฐ ์ „์šฉ ํ”„๋กœํผํ‹ฐ id ๊ฐ’์€ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๋‹ค.
    

     

     

     

    5. Record<K,T>

    ๐Ÿ‘‰๐Ÿป Record<K,T> ์—ฌ๊ธฐ์„œ K๋Š” key ์ด๊ณ , T๋Š” type์ด๋‹ค.

    ์˜ˆ์‹œ๋น„๊ต

    • ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ˆ์ œ๊ฐ€ ์žˆ๋‹ค.
    interface Score {
      "1": "A" | "B" | "C" | "D";
      "2": "A" | "B" | "C" | "D";
      "3": "A" | "B" | "C" | "D";
      "4": "A" | "B" | "C" | "D";
    }
    
    const score: Score = {
      1: "A",
      2: "B",
      3: "C",
      4: "D",
    };
    • ์—ฌ๊ธฐ์„œ Record<K,T> ๋ฅผ ํ™œ์šฉํ•ด ๋ณด๋ฉด..
    // ๐Ÿ“Œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค.
    const score: Record<"1" | "2" | "3" | "4", "A" | "B" | "C" | "D"> = {
      1: "A",
      2: "B",
      3: "C",
      4: "D",
    };
    • ์ข€ ๋” ์ •๋ฆฌํ•ด์„œ ๋‚˜ํƒ€๋‚ด๋ณด์ž !
    type Grade = "1" | "2" | "3" | "4";
    type Score = "A" | "B" | "C" | "D";
    
    const score: Record<Grade, Score> = {
      1: "A",
      2: "B",
      3: "C",
      4: "D",
    };

    ๋‹ค๋ฅธ ํ™œ์šฉ ์˜ˆ์ œ

    interface User {
      id: number;
      name: string;
      age: number;
    }
    
    function isValid(user: User) {
      const result: Record<keyof User, boolean> = {
        // ๐Ÿ“Œ User์˜ ํ‚ค๊ฐ’์„ ์ฐธ์กฐ, Record<K,T>๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‚˜ํƒ€๋‚ผ์ˆ˜ ์žˆ๋‹ค.
        id: user.id > 0,
        name: user.name !== "",
        age: user.age > 0,
      };
      return result;
    }
    

     

     

     

    6. Pick<T,K>

    ๐Ÿ‘‰๐Ÿป Pick<T,K> T ํƒ€์ž…์—์„œ K ํ”„๋กœํผํ‹ฐ๋งŒ ๊ณจ๋ผ์„œ ์‚ฌ์šฉํ•œ๋‹ค.
    interface User {
      id: number;
      name: string;
      age: number;
      gender: "m" | "w";
    }
    
    const admin: Pick<User, "id"| "name"> = {
      id: 0,
      name: "bob",
    };

     

     

     

    7. Omit<T,K>

    ๐Ÿ‘‰๐Ÿป Pick<T,K>๊ณผ ๋ฐ˜๋Œ€๋กœ ํŠน์ • ํ”„๋กœํผํ‹ฐ๋งŒ ์ œ์™ธํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    interface User {
      id: number;
      name: string;
      age: number;
      gender: "m" | "w";
    }
    
    const admin: Omit<User, "age"| "gender"> = {
      id: 0,
      name: "bob",
    };

     

     

     

    8. Exclude<T1,T2>

    ๐Ÿ‘‰๐Ÿป Exclude<T1,T2> T1 ์—์„œ T2๋ฅผ ์ œ์™ธํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ
    type T1 = string | number | boolean;
    type T2 = Exclude<T1, number>; // ๐Ÿ“Œ T2๋Š” number์ด ์ œ์™ธ๋˜๊ณ  string ๊ณผ boolean๋งŒ ๋‚จ๊ฒŒ ๋œ๋‹ค.

     

     

     

     

    9. NonNullable

    ๐Ÿ‘‰๐Ÿป Null ์„ ์ œ์™ธํ•œ ํƒ€์ž…์„ ์ƒ์„ฑํ•œ๋‹ค.(undefined๋„ ํ•จ๊ป˜ ์ œ์™ธ ์‹œํ‚จ๋‹ค.)
    type T1 = string | null | undefined | void;
    type T2 = NonNullable<T1> // ๐Ÿ“Œ T2๋Š” string ๊ณผ void ๋งŒ ๋‚จ๊ฒŒ ๋œ๋‹ค.
    

     

     

     

     

    ๐Ÿ“š ์ฐธ๊ณ  )

    https://www.typescriptlang.org/docs/handbook/utility-types.html
    https://www.youtube.com/watch?v=IeXZo-JXJjc&list=PLZKTXPmaJk8KhKQ_BILr1JKCJbR0EGlx0&index=8

    ๋Œ“๊ธ€