์ผ์ƒ/Today I Learned

[๋ฐ๋ธŒ์ฝ”์Šค Day52] 2022.12.27

YJzero 2022. 12. 27. 20:34

๐Ÿ“–์˜ค๋Š˜ ๋ฐฐ์šด  ๊ฒƒ

forwardRef

:์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ „๋‹ฌ๋ฐ›์€ ref๋ฅผ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋กœ ์ „๋‹ฌํ•˜๋Š” ์—ญํ• 

 

 

useImperativeHandle

:ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ forwardRef์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ž์‹ ์ปดํฌ๋„ŒํŠธ ref์— ์„ค์ •ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ref๋ฅผ ์„ค์ •ํ•ด์„œ ์ž์‹์—๊ฒŒ ๋ณด๋‚ธ๋‹ค.

function Parent() {
  const inputRef = useRef();
  return (
    <div>
      <Input ref={inputRef} />
      <button onClick={() => inputRef.current.focus()}>Focus</button>
      <button onClick={() => inputRef.current.clear()}>Clear</button>
    </div>
  );
}

 

์ž์‹ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ถ€๋ชจ์—์„œ ๋‚ด๋ ค๋ฐ›์€ ref๋ฅผ ๋ฐ›์•„์„œ useImperativeHandle์„ ์ด์šฉํ•ด์„œ ๋ฉ”์„œ๋“œ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋ถ€๋ชจ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ์ด ๋กœ์ง์— ๋Œ€ํ•ด ๋ชฐ๋ผ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 

import React, { forwardRef, useImperativeHandle, useRef } from "react";

const Input = forwardRef((_, ref) => {
  const inputRef = useRef();
  useImperativeHandle(ref, () => ({
    clear: () => {
      inputRef.current.value = "";
    },
    focus: () => {
      inputRef.current.focus();
    },
  }));
  return (
    <>
      Input: <input ref={inputRef} />
    </>
  );
});

export default Input;

 

 

 

 

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ

์žฅ์ 

  1. ํƒ€์ž…์ด ์ง€์ •๋˜์–ด ์žˆ๋‹ค.

→ ์•ˆ์ •์„ฑ: ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ๋ฏธ๋ฆฌ ์˜ค๋ฅ˜๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

→ ๊ฐ€๋…์„ฑ: ํƒ€์ž…์„ ๋ณด๊ณ  ๋ฌด์—‡์„ ํ•˜๋Š”์ง€ ๋ฏธ๋ฆฌ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

๋‹จ์ 

  1. ์ดˆ๊ธฐ ์„ค์ •์„ ํ•ด์•ผํ•œ๋‹ค.
  2. ์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด์˜ ์œ ์—ฐ์„ฑ์ด ๋‚ฎ์•„์ง„๋‹ค.
  3. ์ปดํŒŒ์ผ ์‹œ๊ฐ„์ด ๊ธธ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

 

๋ฌธ๋ฒ•

1. ํƒ€์ž… ์ฃผ์„๊ณผ ํƒ€์ž… ์ถ”๋ก 

  • ํƒ€์ž… ์ฃผ์„: ๋ณ€์ˆ˜, ์ƒ์ˆ˜ ํ˜น์€ ๋ณ€ํ™˜ ๊ฐ’์ด ๋ฌด์Šจ ํƒ€์ž…์ธ์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์„ ์˜๋ฏธ
  • ํƒ€์ž… ์ถ”๋ก : ํ•ด๋‹น ๋ณ€์ˆ˜๊ฐ€ ์–ด๋–ค ํƒ€์ž…์ธ์ง€ ์ถ”๋ก ํ•˜๋Š” ๊ฒƒ. ์ƒ๋žตํ•˜๋ฉด ์ปดํŒŒ์ผ ํƒ€์ž„์— ์•Œ์•„๋‚ธ๋‹ค.
let a: number = 1; //ํƒ€์ž… ์ฃผ์„
let b = 2; //ํƒ€์ž…์„ ๋ช…์‹œํ•˜์ง„ ์•Š์•˜์ง€๋งŒ ์ปดํŒŒ์ผ ํƒ€์ž„์— b์˜ ํƒ€์ž…์ด number์ผ ๊ฒƒ์ด๋ผ๊ณ  ์ถ”๋ก 

let c = {a: 1}; //์ดํ›„์— c.b๋“ฑ์œผ๋กœ ๊ฐ’ ์ถ”๊ฐ€๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.
let d: number[] = []; //number๋กœ ํƒ€์ž…์„ ์ง€์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ํƒ€์ž…์˜ ๊ฐ’์€ ๋„ฃ์„ ์ˆ˜ ์—†๋‹ค.
let e: 'good' = 'good'; //ํŠน์ • ๋ฌธ์ž์—ด, ๊ฐ’ ๋“ฑ์„ ํƒ€์ž…์œผ๋กœ ์ง€์ •ํ•˜์—ฌ ๊ทธ ๊ฐ’๋งŒ ์“ฐ๋„๋ก ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ๋‹ค.
let g: any = 3; //any๋Š” ์•„๋ฌด ํƒ€์ž…์ด๋‚˜ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค.

function add(a: number, b:number): number {
return a+ b;
}
//a, b, ๋ฆฌํ„ด ๊ฐ’์˜ ํƒ€์ž…์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

2. ์ธํ„ฐํŽ˜์ด์Šค

:๊ฐ์ฒด์˜ ํƒ€์ž…์„ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•. interface๋ผ๋Š” ํ‚ค์›Œ๋“œ๋กœ ๊ฐ€๋Šฅํ•˜๋‹ค.

interface Company {
    name: string;
    age: number;
    address?: string; //์„ ํƒ์†์„ฑ (Optional)
}

/**์ธํ„ฐํŽ˜์ด์Šค๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์ธํ„ฐํŽ˜์ด์Šค์— ์žˆ๋Š” name, age, address๋Š” ๋ฌด์กฐ๊ฑด ํ”„๋กœํผํ‹ฐ๋กœ
*์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค.
*ํ•˜์ง€๋งŒ address์—๋Š” ? ์˜ต์…”๋„์ด ๋ถ™์–ด์žˆ์œผ๋ฏ€๋กœ ์—†์–ด๋„ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜์ง€ ์•Š๋Š”๋‹ค.
*/
const cobalt: Company = {
    name: "cobalt",
    age: 3,
    address: "Seoul" //์—†์–ด๋„ ๋จ
}

/**์ต๋ช… ์ธํ„ฐํŽ˜์ด์Šค
*์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ฐ”๋กœ ์„ค์ •ํ•ด์„œ ์ด๋ฆ„์—†์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
*ํ•œ๋ฒˆ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ต๋ช… ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ ์ ˆํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
*/
const person: {
    name: string,
    age?: number
} = {
    name: "Lee",
    age: 100
}

 

3. tuple

:๋ฐฐ์—ด์„ Tuble๋กœ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

//๋ฐฐ์—ด ๊ฐ’์˜ ํƒ€์ž…์„ ์ง€์ •ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•
const tuple: [string, number] = ['Lee', 100];

4. enum

:์—ด๊ฑฐํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

enum Color {
    RED,
    GREEN,
    BLUE
}

const color = Color.BLUE;
/**enum์„ ํ†ตํ•ด์„œ ๊น”๋”ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์—ด๊ฑฐ๋œ ํ•ด๋‹น ๊ฐ’๋“ค์—๋Š” ์ˆœ์„œ๋Œ€๋กœ ์ˆซ์ž๊ฐ€ ๋“ค์–ด๊ฐ€๋Š”๋ฐ ๋งŒ์•ฝ
*์ˆซ์ž๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ๊ฒŒ ์‹ซ๋‹ค๋ฉด
*/
enum Color {
    RED='red',
    GREEN='green',
    BLUE='blue'
}
//์ด๋ ‡๊ฒŒ ์ปค์Šคํ…€์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

5. ๋Œ€์ˆ˜ํƒ€์ž…

:์—ฌ๋Ÿฌ ์ž๋ฃŒํ˜•์˜ ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•

→ ํ•ฉ์ง‘ํ•ฉ ํƒ€์ž…๊ณผ ๊ต์ง‘ํ•ฉ ํƒ€์ž…์ด ์žˆ๋‹ค.

//ํ•ฉ์ง‘ํ•ฉ ํƒ€์ž…
// | ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์–ด๋А ํ•œ ํƒ€์ž…์—๋งŒ ์†ํ•ด๋„ ์˜ค๋ฅ˜๊ฐ€ ๋œจ์ง€ ์•Š๋Š”๋‹ค.
let numOrStr: number | string = 1;

//๊ต์ง‘ํ•ฉ ํƒ€์ž…
//๋‘ ๊ฐœ์˜ ํƒ€์ž…์ด ๋‘˜ ๋‹ค ํฌํ•จ๋˜์–ด์•ผ ํ•œ๋‹ค.
let numAndStr: number & string = ''; 
//ํ•˜์ง€๋งŒ number์™€ string์ด ๋‘˜๋‹ค ํฌํ•จ๋œ๋‹ค๋Š” ๊ฒƒ์€ ๋ง์ด ์•ˆ๋จ
// -> ์›์‹œ ํƒ€์ž…์—์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค!
// ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

interface Name {
    name: string
}

interface Age {
    age: number
}

let nameAndage: Name & Age = {
    name: 'yoo',
    age: 44
} //Name๊ณผ Age ๋ชจ๋‘ ํฌํ•จ๋˜์–ด์•ผ ์˜ค๋ฅ˜๊ฐ€ ๋œจ์ง€ ์•Š๋Š”๋‹ค.

type Person = Name & Age;
//type์„ ์‚ฌ์šฉํ•ด์„œ ํƒ€์ž…์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋” ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
let hee: Person = {
    name: 'hee',
    age: 100
}

 

6. Optional

interface Post {
    title: string;
    content: string;
}

interface ResponseData {
    post?: Post;
    message?: string;
    status: number;
}

const response: ResponseData[] = [
    {
        post: {
            title: 'Hello',
            content: 'How are you?'
        },
        status: 200
    },
    {
        message: 'Error!',
        status: 500
    }
];

console.log(response[1].post && response[1].post.title);
//์˜ต์…”๋„ ์ฒด์ด๋‹์ด ์ƒ๊ธฐ๊ธฐ ์ด์ „์—๋Š” &&์ด์šฉํ•ด์„œ ๊ฐ’์ด ์žˆ๋Š”์ง€ ํ™•์ธ. ์—†์œผ๋ฉด undefined ๋ฐ˜ํ™˜
console.log(response[1].post?.title); //post๊ฐ€ ์—†์œผ๋ฉด ์ž๋™์œผ๋กœ undefined ๋ฐ˜ํ™˜
console.log(response[1].post!.title); //๋А๋‚Œํ‘œ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๋ฌด์กฐ๊ฑด ๊ฐ’์ด ์žˆ๋‹ค๋Š” ์˜๋ฏธ

 

7. Generic

:ํ•˜๋‚˜์˜ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์—ฌ๋Ÿฌ ํƒ€์ž…์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•

interface Value<T> {
    value: T;
}
//Value ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์—ฌ๋Ÿฌ ํƒ€์ž…์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ generic์„ ์ด์šฉํ•œ๋‹ค.

const value1: Value<number> = {//๊บฝ์‡ ์•ˆ์— ์›ํ•˜๋Š” ํƒ€์ž…์„ ๋„ฃ์–ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.
    value: 1
}

const value2: Value<string> = {
    value: '1'
}

//ํ•จ์ˆ˜์—๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
function toString<T>(a: T):string {
    return `${a}`
}

toString<number>(5);
toString<string>('5');
toString('5'); 
//ํƒ€์ž…์„ ์ƒ๋žตํ•  ์ˆ˜๋„ ์žˆ๋Š”๋ฐ ๊ทธ๋Ÿฌ๋ฉด ํƒ€์ž…์ถ”๋ก ์ด ๋˜์„œ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ํƒ€์ž…์„๋ณด๊ณ  
//์•Œ์•„์„œ ํƒ€์ž…์„ ์ถ”๋ก ํ•œ๋‹ค.

 

8. Partial, Required, Pick, Omit

: ๊ธฐ์กด interface๋ฅผ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์žฌํ™œ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

interface User {
    id: number;
    name: string;
    age: number;
    address: string;
    createAt?: string;
    updateAt?: string;
}

//Partical ๋ชจ๋“  ํ•„๋“œ๋ฅผ Optional๋กœ ๋งŒ๋“ ๋‹ค.
const partial: Partial<User> = {}

//Required ๋ชจ๋“  ํ•„ํŠธ๊ฐ€ Required๊ฐ€ ๋œ๋‹ค.
const require: Required<User> = {
    id: 1,
    name: 'Lee',
    age: 0,
    address: 'Seoul',
    createAt: '',
    updateAt: '',
}
//createAt๊ณผ updateAt์€ ์˜ต์…”๋„์ž„์—๋„ Required์— ์˜ํ•ด ํ•„์ˆ˜๊ฐ’์ด ๋˜์—ˆ๋‹ค.

//Pick ํŠน์ • ํ•„๋“œ๋งŒ ๊ณจ๋ผ์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
//๋‘๋ฒˆ์งธ๋กœ ๋ฐ›๋Š” ํ•„๋“œ๋งŒ ๊ณจ๋ผ์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
const pick: Pick<User, 'name' | 'age'> = {
    name: '',
    age: 100
}

//omit ํŠน์ • ํ•„๋“œ๋งŒ ๋นผ๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
const omit: Omit<User, 'id' | 'age' | 'address'> = {
    name: '',
}

//name, age, address๋ฅผ ๋ฐ›๋Š”๋ฐ name๋งŒ required๋กœ ํ•˜๊ณ  ์‹ถ์„๋•?

const mixed: Omit<User, 'id' | 'address' | 'age' | 'createAt' | 'updateAt'>& Pick<Partial<User>, 'address' | 'age'> = {
    name: '',
    
}

 

9. extends

: ํŠน์ • ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›์•„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

interface Time {
    hour: number;
    minute: number;
    second: number;
}

interface DateTime extends Time {
    year: number;
    month: number;
    day: number;
}

interface OffsetDateTime extends DateTime {
    offset: 'number';
}

interface ZonedDateTime extends DateTime {
    zoneId: 'string';
}

interface TimeFormat extends Pick<Time, 'hour' | 'minute'> {
    ampm: 'am' | 'pm';
}

const timeFormat: TimeFormat = {
    hour: 10,
    minute: 30,
    ampm: 'am'
}

 

๐Ÿ’ญ๋ฐฐ์šด ์ 

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์–ด๋ ค์šด ๊ฒƒ ๊ฐ™๋‹ค! ๋‹ค๋ฅธ ๊ฐ•์˜๋ฅผ ์ฐพ์•„์„œ ๋ณด๋ฉด์„œ ์ตํ˜€์•ผ ํ•  ๋“ฏ์‹ถ๋‹ค.