πŸͺ„ λŸ¬λ‹ νƒ€μž…μŠ€ν¬λ¦½νŠΈ CH5 - ν•¨μˆ˜

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

πŸͺ„ TypeScript

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

πŸ“Œ λ§€κ°œλ³€μˆ˜ νƒ€μž…

ν•„μˆ˜ λ§€κ°œλ³€μˆ˜

JSμ—μ„œλŠ” 인수의 μˆ˜μ™€ 상관없이 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  수 μžˆλ‹€. ν•˜μ§€λ§Œ TSλŠ” ν•¨μˆ˜μ— μ„ μ–Έλœ λͺ¨λ“  λ§€κ°œλ³€μˆ˜κ°€ ν•„μˆ˜λΌκ³  κ°€μ •ν•œλ‹€. ν•¨μˆ˜κ°€ 잘λͺ»λœ 수의 인수둜 호좜되면 TSλŠ” νƒ€μž… 였λ₯˜μ˜ ν˜•νƒœλ‘œ 의의λ₯Ό μ œκΈ°ν•œλ‹€.

ν•¨μˆ˜μ˜ μΈμˆ˜κ°€ 잘λͺ»λ˜λ©΄ 였λ₯˜λŠ” ν‘œμ‹œν•˜μ§€λ§Œ 싀행은 λ˜λŠ” λ“― ?


선택적 λ§€κ°œλ³€μˆ˜

ν•¨μˆ˜μ—μ„œ μ‚¬μš©λ˜λŠ” λͺ¨λ“  선택적 λ§€κ°œλ³€μˆ˜λŠ” λ§ˆμ§€λ§‰ λ§€κ°œλ³€μˆ˜μ—¬μ•Ό ν•œλ‹€. ν•„μˆ˜ λ§€κ°œλ³€μˆ˜ 전에 선택적 λ§€κ°œλ³€μˆ˜λ₯Ό μœ„μΉ˜μ‹œν‚€λ©΄ λ‹€μŒκ³Ό 같이 TS ꡬ문 였λ₯˜κ°€ λ°œμƒν•œλ‹€.

function announceSinger(singer?: string, song: string){
    
}

κΈ°λ³Έ λ§€κ°œλ³€μˆ˜

JSμ—μ„œ 선택적 λ§€κ°œλ³€μˆ˜λ₯Ό μ„ μ–Έν•  λ•Œ =와 값이 ν¬ν•¨λœ 기본값을 μ œκ³΅ν•  수 μžˆλ‹€.

즉, 선택적 λ§€κ°œλ³€μˆ˜μ—λŠ” 기본적으둜 값이 제곡되기 λ•Œλ¬Έμ— ν•΄λ‹Ή ts νƒ€μž…μ—λŠ” μ•”λ¬΅μ μœΌλ‘œ ν•¨μˆ˜ 내뢀에 | undefined μœ λ‹ˆμ–Έ νƒ€μž…μ΄ μΆ”κ°€λœλ‹€.

function rateSong(song: string, rating = 0){
    console.log(`${song} gets ${rating}/5 stars !`;
}

rateSong("Photograph");
rateSong("Set Fire to the Rain", 5);

λ‹€μŒ rateSong ν•¨μˆ˜μ—μ„œ rating은 number νƒ€μž…μœΌλ‘œ μœ μΆ”λ˜μ§€λ§Œ, ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” μ½”λ“œμ—μ„œλŠ” 선택적 number | undefinedκ°€ λœλ‹€.


λ‚˜λ¨Έμ§€ λ§€κ°œλ³€μˆ˜

... μŠ€ν”„λ ˆλ“œ μ—°μ‚°μž 이용

function singAllTheSongs(singer: string, ...songs: string[]){
    for(const song of songs){
        console.log(`${song}, by ${singer}`);
    }
}

πŸ“Œ λ°˜ν™˜ νƒ€μž…

tsλŠ” ν•¨μˆ˜κ°€ λ°˜ν™˜ν•  수 μžˆλŠ” λͺ¨λ“  κ°€λŠ₯ν•œ 값을 이해해 ν•¨μˆ˜μ˜ λ°˜ν™˜νƒ€μž…μ„ μ•Œλ €κ³  λ…Έλ ₯ν•œλ‹€.

λ”°λΌμ„œ 일반적으둜 ν•¨μˆ˜μ˜ λ°˜ν™˜ νƒ€μž…μ„ λͺ…μ‹œν•˜μ§€ μ•ŠλŠ” 것이 μ’‹μ§€λ§Œ, νŠΉμ • μƒν™©μ—μ„œλŠ” λ°˜ν™˜ νƒ€μž…μ„ λͺ…μ‹œν•˜λŠ” 방식이 μœ μš©ν•  λ•Œκ°€ μžˆλ‹€.

  • κ°€λŠ₯ν•œ λ°˜ν™˜ 값이 λ§Žμ€ ν•¨μˆ˜κ°€ 항상 λ™μΌν•œ νƒ€μž…μ„ λ°˜ν™˜ν•˜λ„λ‘ κ°•μ œ
  • μž¬κ·€ ν•¨μˆ˜μ˜ λ°˜ν™˜νƒ€μž…μ„ 톡해 νƒ€μž…μ„ μœ μΆ”ν•˜λŠ” 것을 κ±°λΆ€ν•œλ‹€.
  • 수백 개 μ΄μƒμ˜ ts 파일이 μžˆλŠ” 큰 ν”„λ‘œμ νŠΈμ—μ„œλŠ” ts νƒ€μž… 검사 속도λ₯Ό 높일 수 μžˆλ‹€ .
function A(songs: string[], count=0): number {
   // ~ 
}

const A = (songs: string[], count=0): number => {
    
}

πŸ“Œ ν•¨μˆ˜ νƒ€μž…

ν™”μ‚΄ν‘œ ν•¨μˆ˜μ™€ λΉ„μŠ·ν•˜κ²Œ =>λ₯Ό μ΄μš©ν•΄ ν•¨μˆ˜μ˜ νƒ€μž…μ„ ν‘œν˜„ν•œλ‹€.

let nothingInGivesString: () => string;

λ‹€μŒ λ³€μˆ˜ νƒ€μž…μ€ λ§€κ°œλ³€μˆ˜κ°€ μ—†κ³  string νƒ€μž…μ„ λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜λ₯Ό λœ»ν•œλ‹€.


ν•¨μˆ˜λ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ κ°€μ§€λŠ” ν•¨μˆ˜

function runOnSongs(getSongAt: (index: number) => string){
    // ~ ~
}

function getSongAt(index: number){
    return `${index}th song`;
}

λ‹€μŒ ν•¨μˆ˜μ˜ λ°˜ν™˜νƒ€μž… : string을 λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜ or undefined

let maybeReturnsString: (() => string) | undefined;

πŸ“Œ λ§€κ°œλ³€μˆ˜ νƒ€μž… μΆ”λ‘ 

let singer: (song: string) => string;

singer = function(song) {
    // song: string νƒ€μž…μœΌλ‘œ μœ μΆ”λœλ‹€. 
    return 'Singing: ${song.toUpperCase()}!';
}

λ‹€μŒ singer λ³€μˆ˜λŠ” string νƒ€μž…μ˜ λ§€κ°œλ³€μˆ˜λ₯Ό κ°–λŠ” ν•¨μˆ˜μ΄λ―€λ‘œ λ‚˜μ€‘μ— singerκ°€ ν• λ‹Ήλ˜λŠ” ν•¨μˆ˜ λ‚΄μ˜ song λ§€κ°œλ³€μˆ˜λŠ” string으둜 μ˜ˆμΈ‘λœλ‹€.


πŸ“Œ ν•¨μˆ˜ νƒ€μž… 별칭

type StringToNumber = (input: string) => number;
let stringToNumber: StringToNumber;

νƒ€μž… 별칭은 특히 ν•¨μˆ˜ νƒ€μž…μ— μœ μš©ν•˜λ‹€. νƒ€μž… 별칭을 μ΄μš©ν•˜λ©΄ 반볡적으둜 μž‘μ„±ν•˜λŠ” λ§€κ°œλ³€μˆ˜μ™€ λ°˜ν™˜ νƒ€μž…μ„ κ°–λŠ” μ½”λ“œ 곡간을 많이 μ ˆμ•½ν•  수 μžˆλ‹€.


πŸ“Œ void, never λ°˜ν™˜ νƒ€μž…

void

  • μ–΄λ–€ 값도 λ°˜ν™˜ν•˜μ§€ μ•ŠλŠ” ν•¨μˆ˜. return 문이 μ—†κ±°λ‚˜ 값을 λ°˜ν™˜ν•˜μ§€ μ•ŠλŠ” return λ¬Έ(return ;)을 가진 ν•¨μˆ˜

  • ν•¨μˆ˜ νƒ€μž… μ„ μ–Έ μ‹œ voidλ₯Ό μ‚¬μš©ν•˜λ©΄ ν•¨μˆ˜μ—μ„œ λ°˜ν™˜λ˜λŠ” λͺ¨λ“  값은 λ¬΄μ‹œλœλ‹€.

    => 사싀 js ν•¨μˆ˜λŠ” μ‹€μ œκ°’μ΄ λ°˜ν™˜λ˜μ§€ μ•ŠμœΌλ©΄ 기본으둜 λͺ¨λ‘ undefinedλ₯Ό λ°˜ν™˜ν•˜μ§€λ§Œ voidλŠ” undefined와 λ™μΌν•˜μ§€ μ•Šλ‹€.

    • void : ν•¨μˆ˜μ˜ λ°˜ν™˜ νƒ€μž…μ΄ λ¬΄μ‹œλœλ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€.
    • undefined : λ°˜ν™˜λ˜λŠ” λ¦¬ν„°λŸ΄ κ°’μœΌλ‘œ, μ •μ˜λ˜μ§€ μ•Šμ€ 값이 λ°˜ν™˜λœλ‹€λŠ” λœ»μ΄λ‹€.
function returnsVoid(){
    return;
}

let lazyValue: string | undefined;

lazyValue = returnsVoid();
// lazyValueλŠ” undefinedλ₯Ό λ°˜ν™˜ν•˜λŠ” νƒ€μž…μΈλ° 여기에 void νƒ€μž…μ˜ 값을 λ„£μœΌλ €κ³  ν•˜λ‹ˆ 였λ₯˜ λ°œμƒ 

=> undefinedλ₯Ό ν¬ν•¨ν•˜λŠ” λŒ€μ‹  void νƒ€μž…μ˜ 값을 ν• λ‹Ήν•˜λ €κ³  ν•˜λ©΄ νƒ€μž… 였λ₯˜κ°€ λ°œμƒν•œλ‹€.


voidλ₯Ό λ°˜ν™˜ν•˜λ„λ‘ μ„ μ–Έλœ νƒ€μž… μœ„μΉ˜μ— μ „λ‹¬λœ ν•¨μˆ˜κ°€ λ°˜ν™˜λœ λͺ¨λ“  값을 λ¬΄μ‹œν•˜λ„λ‘ μ„€μ •ν•  수 μžˆλ‹€.

예λ₯Ό λ“€μ–΄, λ°°μ—΄μ˜ λ‚΄μž₯ forEach λ©”μ„œλ“œλŠ” voidλ₯Ό λ°˜ν™˜ν•˜λŠ” μ½œλ°±μ„ λ°›λŠ”λ‹€. forEach에 μ œκ³΅λ˜λŠ” ν•¨μˆ˜λŠ” μ›ν•˜λŠ” λͺ¨λ“  값을 λ°˜ν™˜ν•  수 μžˆλ‹€. λ‹€μŒ saveRecords ν•¨μˆ˜μ˜ records.push(record)λŠ” number(λ°°μ—΄μ˜ .push()μ—μ„œ λ°˜ν™˜λœ κ°’)λ₯Ό λ°˜ν™˜ν•˜μ§€λ§Œ, μ—¬μ „νžˆ newRecords.forEach에 μ „λ‹¬λœ ν™”μ‚΄ν‘œ ν•¨μˆ˜μ— λŒ€ν•œ λ°˜ν™˜κ°’μ΄ ν—ˆμš©λœλ‹€.

const records: string[] = [];

function saveRecords(newRecords: string[]){
    newRecords.forEach(record => records.push(record));
}

saveRecords(['21', 'Come On Over', 'The Bodyguard'])

never λ°˜ν™˜ νƒ€μž…

never λ°˜ν™˜ ν•¨μˆ˜λŠ” (μ˜λ„μ μœΌλ‘œ) 항상 였λ₯˜λ₯Ό λ°œμƒμ‹œν‚€κ±°λ‚˜ λ¬΄ν•œ 루프λ₯Ό μ‹€ν–‰ν•˜λŠ” ν•¨μˆ˜μ΄λ‹€.

ν•¨μˆ˜λ₯Ό μ ˆλŒ€ λ°˜ν™˜ν•˜μ§€ μ•Šλ„λ‘ μ˜λ„ν•˜λ €λ©΄ λͺ…μ‹œμ  : never νƒ€μž… μ• λ„ˆν…Œμ΄μ…˜μ„ μΆ”κ°€ν•΄ ν•΄λ‹Ή ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•œ ν›„ λͺ¨λ“  μ½”λ“œκ°€ μ‹€ν–‰λ˜μ§€ μ•ŠμŒμ„ λ‚˜νƒ€λ‚Έλ‹€.

λ‹€μŒ fail ν•¨μˆ˜λŠ” 였λ₯˜λ§Œ λ°œμƒμ‹œν‚€λ―€λ‘œ param의 νƒ€μž…μ„ string으둜 μ’ν˜€μ„œ νƒ€μž…μŠ€ν¬λ¦½νŠΈμ˜ μ œμ–΄ 흐름 뢄석을 도와쀀닀.

function fail(message: string): never {
    throw new Error('Invariant failure: ${message}');
}

function workWithUnsafeParam(param: unknown){
    if(typeof param !== 'string'){
        fail(`param should be a string, not ${typeof param}`)
    }
    
    param.toUpperCase();
}

πŸ“Œ ν•¨μˆ˜ μ˜€λ²„λ‘œλ“œ

ν•˜λ‚˜μ˜ μ΅œμ’… κ΅¬ν˜„ μ‹œκ·Έλ‹ˆμ²˜μ™€ κ·Έ ν•¨μˆ˜μ˜ λ³Έλ¬Έ μ•žμ— μ„œλ‘œ λ‹€λ₯Έ λ²„μ „μ˜ ν•¨μˆ˜ 이름, λ§€κ°œλ³€μˆ˜, λ°˜ν™˜ νƒ€μž…μΈ μ˜€λ²„λ‘œλ“œ μ‹œκ·Έλ‹ˆμ²˜λ₯Ό μ—¬λŸ¬λ²ˆ μ„ μ–Έν•¨μœΌλ‘œμ¨ λ‹€μ–‘ν•œ λ§€κ°œλ³€μˆ˜λ“€λ‘œ ν˜ΈμΆœλ˜λŠ” ν•¨μˆ˜λ₯Ό μ •μ˜ν•  수 μžˆλ‹€.

function createDate(timestamp: number): Date;
function createDate(month: number, day: number, year: number): Date;
function createDate(monthOrTimeStamp: number, day?: number, year?: number){
   return day === undefined || year === undefined 
   	? new Date(monthOrTimeStamp)
   	: new Date(year, monthOrTimeStamp, day);
}

createDate(554356800); // ok
createDate(7, 27, 1987); // ok

createDate(4, 1) // Error

ν•¨μˆ˜ μ˜€λ²„λ‘œλ“œλŠ” λ³΅μž‘ν•˜κ³  μ„€λͺ…ν•˜κΈ° μ–΄λ €μš΄ ν•¨μˆ˜ νƒ€μž…μ— μ‚¬μš©ν•˜λŠ” μ΅œν›„μ˜ μˆ˜λ‹¨μ΄λ‹€. ν•¨μˆ˜λ₯Ό λ‹¨μˆœν•˜κ²Œ μœ μ§€ν•˜κ³  κ°€λŠ₯ν•˜λ©΄ ν•¨μˆ˜ μ˜€λ²„λ‘œλ“œλ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 것이 μ’‹λ‹€.


πŸͺ„ ν•¨μˆ˜ μ •μ˜ μ‹œ νƒ€μž…μ„ λ‚˜νƒ€λ‚΄λŠ” κ°€μž₯ 일반적인 2가지 방법

  1. 일반 ν•¨μˆ˜

    function A(a: string, b: number): number {
        // stringκ³Ό numberλ₯Ό λ°›μ•„μ„œ numberλ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜
    }
  2. ν™”μ‚΄ν‘œ ν•¨μˆ˜

    const A = (a: string, b: number):number => {
        // stringκ³Ό numberλ₯Ό λ°›μ•„μ„œ numberλ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜
    }
profile
κΎΈμ€€νžˆ, 깊게

0개의 λŒ“κΈ€