μλ°μ€ν¬λ¦½νΈ νλ‘κ·Έλ¨μμ κ°μ₯ ν΅μ¬μ μΈ μν μ μ°¨μ§νλ ν¨μ νμ
μ΄ νμ
μ€ν¬λ¦½νΈμμ μ΄λ»κ² ννλλμ§ λ€λ£¬λ€.
ν¨μμ νμ
ν¨μμ νμ
μ κ²°μ νκΈ° μν΄μλ λ€μ λ κ°μ§ μ λ³΄κ° νμνλ€.
- λ§€κ°λ³μ(parameter)μ νμ
- λ°νκ°(return value)μ νμ (λ°ν νμ )
λ§€κ°λ³μμ κ²½μ°, λ³μμ νμ
μ νκΈ°ν λμ λ§μ°¬κ°μ§λ‘ λ§€κ°λ³μ λ€μ μ½λ‘ (:)μ λΆμ΄κ³ νμ
μ μ λλ€. (param1: number)
λ°ν νμ
μ λ§€κ°λ³μ λͺ©λ‘μ λ«λ κ΄νΈ())μ ν¨μ λ³Έλ¬Έμ μ¬λ μ¬λ λκ΄νΈ({) μ¬μ΄μ μ½λ‘ μ λΆμ΄κ³ νκΈ°νλ€. (function (): number { ... })
μλ₯Ό λ€μ΄ λ μ«μλ₯Ό λ°μ κ·Έ ν©μ λ°ννλ ν¨μλ λ€μκ³Ό κ°μ΄ νμ
νκΈ°νλ€.
function sum(a: number, b: number): number { return (a + b); }
λ§μ½ ν¨μκ° μλ¬΄λ° κ°λ λ°ννμ§ μκ³ μ’
λ£λλ€λ©΄ λ°ν νμ
μΌλ‘ void λ₯Ό μ¬μ©νλ€.
function logGreetings(name: string): void { console.log(`Hello, ${name}!`); }
void λ°ν νμ
μ κ°λ ν¨μκ° undefinedλ null μ΄μΈμ κ°μ λ°ννλ©΄ νμ
μλ¬κ° λ°μνλ€. voidκ° μλ λ°ν νμ
μ κ°λ ν¨μκ° μ무 κ°λ λ°ννμ§ μλ κ²½μ°λ λ§μ°¬κ°μ§λ€.
function notReallyVoid(): void { return 1; } // error TS2322: Type '1' is not assignable to type 'void'. function actuallyVoid(): number { } // error TS2355: A function whose declared type is neither 'void' nor 'any' must return a value.
ν¨μ κ°μ νμ νκΈ°
ν¨μ νμ
μ κ°μ νμ
νκΈ°λ₯Ό λΆμ΄κΈ° μν΄μλ νμ΄ν ν¨μ μ μ λ¬Έλ²κ³Ό λΉμ·ν λ¬Έλ²μ μ¬μ©νλ€.
(...λ§€κ°λ³μ λμ΄) => λ°ν νμ
λ§€κ°λ³μκ° μλ ν¨μμ κ²½μ° λ§€κ°λ³μλ₯Ό μλ΅ν΄ μλμ κ°μ΄ μ λλ€.
() => λ°ν νμ
μμλ₯Ό λ€μ΄λ³΄λ©΄ μλμ κ°λ€. νμ΄ν ν¨μ λ¬Έλ²μ μ¬μ©ν ν¨μ λν λΉμ·νκ² μ μ κ°λ₯νλ€.
const yetAnotherSum: (a: number, b: number) => number = sum; const onePlusOne: () => number = () => 2; const arrowSum: (a: number, b: number) => number = (a, b) => (a + b);
νμ
λ³μΉ λν μ¬μ© κ°λ₯νλ€.
type SumFunction = (a: number, b: number) => number; const definitelySum: SumFunction = (a, b) => (a + b);
κΈ°λ³Έ λ§€κ°λ³μ
ES6μ λ§μ°¬κ°μ§λ‘, νμ
μ€ν¬λ¦½νΈμμλ κΈ°λ³Έ λ§€κ°λ³μ λ¬Έλ²μ μ¬μ©ν μ μλ€. μ΄ λ κΈ°λ³Έκ°μ
λ§€κ°λ³μλͺ : νμ = κΈ°λ³Έκ°
function greetings(name: string = 'stranger'): void { console.log(`Hello, ${name}`); } greetings('Heejong'); // Hello, Heejong! greetings(); // Hello, stranger!
μ ν λ§€κ°λ³μ
λ§μ νλ‘κ·Έλλ° μΈμ΄λ ν¨μ μ μμ λͺ
μλ λ§€κ°λ³μμ μλ³΄λ€ λ§κ±°λ μ μ μμ μΈμκ° λ€μ΄μ¨ κ²½μ° μλ¬λ₯Ό λ±λλ€.
ννΈ, μλ°μ€ν¬λ¦½νΈλ λ λ€μ΄μ¨ μΈμλ λ²λ¦¬κ³ , λ λ€μ΄μ¨ μΈμλ undefinedκ° λ€μ΄μ¨ κ²κ³Ό λμΌνκ² μ·¨κΈν ν μ΄λ»κ²λ ν¨μλ₯Ό μ€ννλ € μλνλ€.
μ΄λ° μΈμ΄μ νΉμ± λ° κΈ°μ‘΄ μ¬μ©λ‘λ₯Ό ν¬μ©νλ©΄μ νμ
μμ μ±μ ν보νκΈ° μν΄ νμ
μ€ν¬λ¦½νΈλ μ ν λ§€κ°λ³μλ₯Ό μ§μνλ€.
ν¨μμ λ§€κ°λ³μ μ΄λ¦ λ€μ λ¬Όμν(?) κΈ°νΈλ₯Ό λΆμ¬ ν΄λΉ λ§€κ°λ³μκ° μλ΅ λ μ μμμ λͺ
μν μ μλ€. μλ₯Ό λ€μ΄, optional?: number λ‘ μ μΈλ μ ν λ§€κ°λ³μ optionalλ₯Ό ν¨μ λ³Έλ¬Έμμ number νμ
κ°μΌλ‘ μ¬μ©νλ €λ©΄ ν΄λΉ κ°μ΄ undefinedκ° μλμ§λ₯Ό λ¨Όμ κ²μ¬ν΄μΌ νλ€.
function fetchVideo(url: string, subtitleLanguage?: string) { const option = { url }; if (subtitleLanguage) { option.subtitleLanguage = true; } /* ... */ } fetchVideo('https://example.com', 'ko'); // okay fetchVideo('https://example.com'); // also okay
μ΄ λ λ§€κ°λ³μ μ μ μμμμ μ ν λ§€κ°λ³μ μ΄νμ νμ λ§€κ°λ³μλ₯Ό λλ κ²μ νμ©λμ§ μλλ€.
function invalidFetchVideo(subtitleUrl?: string, url: string) { /* ... */ } //error TS1016: A required parameter cannot follow an optional parameter.
μ΄λ¬ν μ μ½μ΄ μ‘΄μ¬νλ μ΄μ λ λ§μ½ νμ λ§€κ°λ³μκ° μ ν λ§€κ°λ³μ λ€μ μμ μ, μΈμκ° μ΄λ€ λ§€κ°λ³μμ κ°μΈμ§ ꡬλΆν μ μκΈ° λλ¬Έμ΄λ€.
μλ₯Ό λ€μ΄ μμ λ ν¨μλ₯Ό μλμ κ°μ΄ νΈμΆνλ κ²½μ°λ₯Ό μκ°ν΄λ³΄μ.
fetchVideo('https://example.com'); invalidFetchVideo('https://example.com');
μ΄ λ 첫 λ²μ§Έ νΈμΆμ κ²½μ° μΈμκ° url λ§€κ°λ³μμ κ°μ΄λΌλ κ²μ΄ λͺ
λ°±νλ€.
ννΈ λ λ²μ§Έ νΈμΆμμλ 'https://example.com' μ΄λΌλ κ°μ΄ μ νλ§€κ°λ³μμΈ subtitleUrlμ κ°μΌλ‘ μ°μΈκ±΄μ§, λλ urlμ κ°μΌλ‘ μ°μΈ κ±΄μ§ λͺ¨νΈνλ€.
λ°λΌμ νμ
μ€ν¬λ¦½νΈλ μ΄λ° μμ ν¨μ μ μλ₯Ό λ§λλ©΄ μ€λ₯λ₯Ό λ°μμν¨λ€.
ν¨μ μ€λ²λ‘λ©
μλ°μ€ν¬λ¦½νΈμμλ ν ν¨μκ° μ¬λ¬ μμ λ§€κ°λ³μ-λ°ν νμ
μμ κ°λ κ²½μ°κ° λ§€μ° ννλ€.
μ΄λ° ν¨μμ νμ
μ μ μν μ μκ² νκ³ μ νμ
μ€ν¬λ¦½νΈλ ν¨μ μ€λ²λ‘λ©(function overloading)μ μ§μνλ€.
νμ
μ€ν¬λ¦½νΈμ ν¨μ μ€λ²λ‘λ©μ λ€μκ³Ό κ°μ νΉμ§μ κ°λλ€.
- ν¨μλ νλ μ΄μμ νμ μκ·Έλμ²λ₯Ό κ°μ§ μ μλ€.
- ν¨μλ λ¨ νλμ ꡬνμ κ°μ§ μ μλ€.
μ¦, μ€λ²λ‘λ©μ ν΅ν΄μ μ¬λ¬ ννμ ν¨μ νμ
μ μ μν μ μμ§λ§, μ€μ ꡬνμ ν λ²λ§ κ°λ₯νλ―λ‘ μ¬λ¬ κ²½μ°μ λν λΆκΈ°λ ν¨μ λ³Έλ¬Έ λ΄μμ μ΄λ£¨μ΄μ ΈμΌ νλ€
μλ₯Ό λ€μ΄ λ€μ ν¨μλ€μ 보μ.
function doubleString(str: string): string { return `${str}${str}`; } function doubleNumber(num: number): number { return (num * 2); } function doubleBooleanArray(arr: boolean[]): boolean[] { return arr.concat(arr); }
μ΄ ν¨μλ€μ κ°κ° λ¬Έμμ΄, μ«μ, κ·Έλ¦¬κ³ λΆλ¦¬μΈμ λ°°μ΄μ λ°μ λ λ°°λ‘ λ§λλ ν¨μλ€.
μ΄ λ, βλ λ°°βκ° μλ―Ένλ 건 νμ
μ λ°λΌ λ€λ₯΄κ³ , μΈ ν¨μλ μΈν νμ
μ λ°λΌ λ€λ₯Έ νμ
μ κ°μ λ°ννλ€.
μ΄ μΈ ν¨μλ₯Ό ν¨μ μ€λ²λ‘λ©μ μ¬μ©ν΄μ νλμ
double
μ΄λΌλ ν¨μλ‘ ν©μ³λ³΄μ.λ¨Όμ κ° κ²½μ°μ νμ
μκ·Έλμ³λ₯Ό μ μνλ€. νμ
μκ·Έλμ³λ ν¨μ μ μμ λμΌνλ, λ³Έλ¬Έμ΄ μλ΅λ ννλ€.
function double(str: string): string; function double(num: number): number; function double(arr: boolean[]): boolean[]; function double(arg) { if (typeof arg === 'string') { return `${arg}${arg}`; } else if (typeof arg === 'number') { return arg * 2; } else if (Array.isArray(arg)) { return arg.concat(arg); } } const num = double(3); // number const str = double('ab'); // string const arr = double([true, false]); // boolean[]
μ΄λ κ² μ€λ²λ‘λ©μ ν΅ν΄ μ μλ double ν¨μλ νΈμΆνλ μΈμμ νμ
μ λ°λΌ λ°ν νμ
μ΄ λ¬λΌμ§λ€.
This νμ
μμ 2μ₯μμ μΈκΈνμ§λ§, μλ°μ€ν¬λ¦½νΈ ν¨μ λ΄λΆμμμ this κ°μ ν¨μκ° μ μλλ μμ μ΄ μλ μ€νλλ μμ μ κ²°μ λλ€.
μ΄λ° νΉμ±μ ν¨μ λ΄λΆμμ this μ νμ
μ μΆλ‘ νλ μΌμ λ§€μ° μ΄λ ΅κ² λ§λ λ€.
νμ
μ€ν¬λ¦½νΈλ μ΄λ° μ΄λ €μμ ν΄κ²°νκΈ° μν΄ ν¨μ λ΄μμμ this νμ
μ λͺ
μν μ μλ μλ¨μ μ 곡νλ€.
ν¨μμ this νμ
μ λͺ
μνκΈ° μν΄μ ν¨μμ νμ
μκ·Έλμ³μμ λ§€κ°λ³μ κ°μ₯ μμ this λ₯Ό μΆκ°ν΄μΌ νλ€.
μ΄ λ this νμ
μ νμ
μμ€ν
μ μν΄μλ§ μ‘΄μ¬νλ μΌμ’
μ κ°μ§ νμ
μ΄λ€.
μ¦, this λ§€κ°λ³μλ₯Ό μΆκ°νλ€κ³ ν΄λ ν¨μκ° λ°λ μΈμ μμ κ°μ μ€μ λμμ λ³νμ§ μλλ€.
interface HTMLElement { tagName: string; /* ... */ } interface Handler { (this: HTMLElement, event: Event, callback: () => void): void; } let cb: any; // μ€μ ν¨μ λ§€κ°λ³μμλ thisκ° λνλμ§ μμ const onClick: Handler = function(event, cb) { // thisλ HTMLElement νμ console.log(this.tagName); cb(); }
λ§μ½ thisμ νμ
μ voidλ‘ λͺ
μνλ€λ©΄ ν¨μ λ΄λΆμμ thisμ μ κ·Όνλ μΌ μ체λ₯Ό λ§μ μ μλ€.
interface NoThis { (this: void): void; } const noThis: NoThis = function() { console.log(this.a); // Property 'a' does not exist on type 'void'. }
// κ°μ μ½λ function add(n1: number, n2: number) { return n1 + n2; } function printResult(num: number): void { console.log('Result: ' + num); } function addAndHandle(n1: number, n2: number, cb: (num: number) => void) { const result = n1 + n2; cb(result); } printResult(add(5, 12)); let combineValues: (a: number, b: number) => number; combineValues = add; // combineValues = printResult; // combineValues = 5; console.log(combineValues(8, 8)); // let someValue: undefined; addAndHandle(10, 20, (result) => { console.log(result) });
Β