์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

[ts] void ,any, unknown, never ํƒ€์ž…

ehddkDEV 2024. 10. 18. 14:19

๐Ÿ“Œ void

type AppsettingContextType={
    fontSize: FontSize;
  theme: Theme;
  setTheme:(theme:Theme) =>void;
  setFontSize:(fontSize:FontSize)=>void
};

์ด๋ ‡๊ฒŒ ํƒ€์ž… ์„ ์–ธ์—์„œ void ํƒ€์ž…์„ ๋ณธ์ ์ด ์žˆ์„ ๊ฒƒ์ด๋‹ค.

 

void๋Š” typescript์—์„œ ๋ฐ˜ํ™˜ ํƒ€์ž…์ด ์—†์Œ์„ ๋ช…์‹œ์ ์œผ๋กœ ํ‘œํ˜„ํ•˜๋Š” ์šฉ๋„์˜ ํƒ€์ž…์ด๋‹ค.

๋ณ€์ˆ˜์˜ ํƒ€์ž…์œผ๋กœ void๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น ๋ณ€์ˆ˜์—๋Š” null ๋˜๋Š” undefined๋งŒ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ํ•ด๋‹น ๋ณ€์ˆ˜์—๋Š” ์œ ํšจํ•œ ๊ฐ’์ด ์—†์Œ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

๊ทธ๋ž˜์„œ ์ฃผ๋กœ ๋„คํŠธ์›Œํฌ ์š”์ฒญ,๋กœ๊ทธ ์ถœ๋ ฅ, ๊ฐ์ฒด ์ƒํƒœ ๋ณ€๊ฒฝ ๋“ฑ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋ชฉ์ ์ธ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ํ›„์— ๋ฐ˜ํ™˜๋œ ๊ฐ’์„ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Œ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค!

 

  • return ๊ฐ’ ํƒ€์ž…์ด void
function example(): void {
     return '3';
}

 

์ด๋Ÿด๋•Œ return ๊ฐ’์—  'string ํ˜•์‹์€ void์— ํ• ๋‹นํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.' ๋ผ๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋œฌ๋‹ค.

์ฆ‰ ํ•จ์ˆ˜์˜ return๊ฐ’ ํƒ€์ž…์ด void์ด๋ผ๋Š” ๊ฒƒ์€, return๊ฐ’์„ ๋„ฃ์œผ๋ฉด ์•ˆ ๋˜๋Š” ๋œป!

ํ•˜์ง€๋งŒ  undefined๋Š” ๋„ฃ์–ด๋„ ๋˜์ง€๋งŒ ์ฃผ๋กœ ์ƒ๋žตํ•˜๊ณ  return;์œผ๋กœ๋งŒ ์„ ์–ธํ•˜๊ณค ํ•œ๋‹ค.

 

์˜ˆ์‹œ 1>

// ๋ฉ”์„œ๋“œ๊ฐ€ void์ธ ๊ฒฝ์šฐ
interface exa {
    eat: () => void;
}
const example:exa = {
    eat() {return 2;}
}
const b = example.eat();

์ด๋ ‡๊ฒŒ b๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด ๊ฐ’์ด 2๊ฐ€ ๋‚˜์˜ฌ๊ฒƒ ๊ฐ™์ง€๋งŒ ๋•ก!

 

์ •๋‹ต์€ void๊ฐ€ ๋‚˜์˜จ๋‹ค.

๋ฉ”์„œ๋“œ๊ฐ€ void์ธ ๊ฒฝ์šฐ์—๋Š” return๊ฐ’์ด ์žˆ๋“  ๋ง๋“  ์ƒ๊ด€์—†์ด void๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๊ทธ๋ž˜์„œ ์• ์ดˆ์—  void๋ฉด ์›์น™์ ์œผ๋กœ return ๊ฐ’์„ ์•ˆ ๋„ฃ๋Š”๊ฒŒ ์ข‹๋‹ค๊ณ  ํ•œ๋‹ค!!

 

์˜ˆ์‹œ 2>

function sayHello(): void {
  console.log("Hello!");
}

const result: void = sayHello(); // ์—๋Ÿฌ๋‚จ.

์ฆ‰ void ํƒ€์ž…์ธ ๋ณ€์ˆ˜์— ๊ฐ’์„ ์ง€์ •ํ•˜๋ ค๊ณ  ํ•˜๋ฉด error๊ฐ€ ๋‚œ๋‹ค.

 

๐Ÿ“Œ any

์˜๋ฏธ ๊ทธ๋Œ€๋กœ ๋ชจ๋“  ํƒ€์ž…์„ ํ• ๋‹น๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…์ด๋‹ค. 

๊ทธ๋Ÿผ ์–ด๋–ค ํƒ€์ž…์ด๋“  ์ƒ๊ด€์—†๋Š” ๊ฑฐ๋„ค?๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ , '์–ด๋–ค ํƒ€์ž…์ด ๋  ์ง€ ๋ชจ๋ฅด๊ฒ ์œผ๋‹ˆ

๋„ˆ๊ฐ€ ์•Œ์•„์„œ ์ถ”๋ก ํ•ด์ค˜' ๋ผ๋Š” ๋œป์œผ๋กœ ์ƒ๊ฐํ•˜๋ฉด ๋” ์ข‹๋‹ค.

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—์„œ any๋ฅผ ์“ฐ๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์ฒ˜๋Ÿผ ํƒ€์ž…์ด ๊ฒ€์‚ฌ๋˜์ง€ ์•Š๊ธฐ์— ์กฐ์‹ฌํ•ด์•ผ ํ•œ๋‹ค.

const value : number = 20;
console.log(value.length); //์—๋Ÿฌ๋‚จ.

number ํƒ€์ž…์—๋Š” length ์†์„ฑ์ด ์—†๊ธฐ์— ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค.

 

์ด๋ฅผ anyํƒ€์ž…์œผ๋กœ ๋ณ€๊ฒฝํ•ด๋ณด์ž.

const value: any = 20;
console.log(value.length); //์—๋Ÿฌ๊ฐ€ ๋‚˜์ง€์•Š๊ณ  undefined๊ฐ€ ๋œธ.

ํ•˜์ง€๋งŒ value๊ฐ’์˜ type์„ ๋ณด๋ฉด number๋กœ ์ฐํžŒ๋‹ค..

๋”ฐ๋ผ์„œ any๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ์—๋Ÿฌ๊ฐ€ ์•ˆ๋‚˜๋„ ์‚ฌ์‹ค์ƒ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ! 

 

๐Ÿ“Œ unKnown

any์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ชจ๋“  ํƒ€์ž…์„ ํ• ๋‹น ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

ํƒ€์ž…์„ ๊ฒ€์‚ฌํ•ด ๊ฐ€๊ณตํ•˜๊ธฐ ์ „๊นŒ์ง€๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ unknown ๊ฐ’์„ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์—†๋‹ค.

 

๋ณดํ†ต error๊ฐ€ unknown์˜ ํƒ€์ž…์„ ๊ฐ–๊ณ  ์žˆ์Œ.

 

any๋Š” ํƒ€์ž… ๊ฒ€์‚ฌ๋ฅผ ํ•˜์ง€ ์•Š๊ธฐ์— ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์‚ฌ์šฉ์˜๋ฏธ๊ฐ€ ์—†๊ธฐ์— ๋น„๊ต์  unknown์„ ์“ฐ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๊ณ  ํ•œ๋‹ค!

๋˜ํ•œ ํƒ€์ž… ์ฒดํฌ ์—†์ด๋Š” ํ•ด๋‹น ๋ณ€์ˆ˜์— ๋Œ€ํ•ด ์•„๋ฌด๋Ÿฐ ์—ฐ์‚ฐ๋„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๊ฒŒ ํ•จ์œผ๋กœ์จ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜์˜ ๊ฐ€๋Šฅ์„ฑ์„ ์ค„์ธ๋‹ค๋Š” ์žฅ์ ๋„ ์žˆ๋‹ค.

์™ธ๋ถ€ API๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๋Š” ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…์„ unknown์œผ๋กœ ์ง€์ •์„ ํ•˜๋Š”๋ฐ, ๊ทธ ์ด์œ ๋Š” ํ•ด๋‹น API์„ ํ˜ธ์ถœํ–ˆ์„๋•Œ 

 ๊ฒฐ๊ณผ์˜ ๊ตฌ์ฒด์ ์ธ ํƒ€์ž…์„ ๋ฏธ๋ฆฌ ์•Œ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค!

 

๐Ÿ“Œnever

 ์—†๋Š” ๊ฐ’์˜ ์ง‘ํ•ฉ์ด์ž,ํ•จ์ˆ˜๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ์ ˆ๋Œ€ ๋ฐ˜ํ™˜๋˜์ง€ ์•Š๋Š” ๊ฐ’์„ ๋งํ•œ๋‹ค.

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—์„œ  ๊ทธ ์–ด๋–ค ๊ฒƒ๋„ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋‚˜ํƒ€๋‚ด๋Š” ํƒ€์ž…์ด ํ•„์š”ํ•˜๋‹ค.

 

When? ์–ธ์ œ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€?

 

1. ์ ˆ๋Œ€ ์‹คํ–‰๋˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜

function throwError(message: string): never {
    throw new Error(message); // ์ด ํ•จ์ˆ˜๋Š” ์ ˆ๋Œ€ ์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ๋˜์ง€ ์•Š์Œ
}

function infiniteLoop(): never {
    while (true) {
        // ๋ฌดํ•œ ๋ฃจํ”„
    }
}

 

๋ฌดํ•œ ๋ฃจํ”„์— ๋น ์ง€๊ฑฐ๋‚˜ ์˜ˆ์™ธ๋ฅผ ๋˜์ ธ์„œ ์ ˆ๋Œ€ ์ข…๋ฃŒ๋˜์ง€ ์•Š์„ ๋•Œ never ํƒ€์ž…์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค๊ณ  ๋ช…์‹œํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ์ด ํ•จ์ˆ˜๋“ค์€ ์–ด๋–ค ๊ฐ’๋„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

2. ์ถ”๊ฐ€์ ์ธ ์ผ€์ด์Šค๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์ •ํ™•ํ•˜๊ฒŒ ๋ช…์‹œ

type Animal = 'cat' | 'dog';

function handleAnimal(animal: Animal) {
    switch (animal) {
        case 'cat':
            console.log('Meow');
            break;
        case 'dog':
            console.log('Woof');
            break;
        default:
            const _exhaustiveCheck: never = animal; // ์˜ค๋ฅ˜ ๋ฐœ์ƒ, Animal์— ๋” ๋งŽ์€ ๊ฐ’์ด ์žˆ์œผ๋ฉด never๋กœ ํ™•์ธ๋จ
            break;
    }
}
  • ์ฝ”๋“œ ๊ฐ€๋…์„ฑ ๋ฐ ๋ช…์‹œ์„ฑ ๊ฐ•ํ™”

     ๊ฐœ๋ฐœ์ž๊ฐ€ ์ด ์ฝ”๋“œ๋ฅผ ๋ณผ ๋•Œ ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ์ผ€์ด์Šค๋ฅผ ๋‹ค๋ค˜๋‹ค๋Š” ํ™•์‹ ์„ ์ฃผ๋Š” ์—ญํ• ์„ ํ•˜์—ฌ ๋ช…ํ™•ํ•œ ์˜๋„ ์ „๋‹ฌ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.