TS 도 JS 처럼 익명함수와 이름 있는 함수를 만들 수 있다.
// JS 에서 함수 만드는 법
function 이름있는함수(x, y) {
return x + y
}
let 익명함수 = function(x, y) { return x + y };
let z = 100;
function addToZ(x, y) {
return x + y + z;
}
function add(x: number, y: number): number {
return x + y;
}
let myAdd = function(x: number, y: number): number { return x + y };
let myAdd: (x: number, y: number) => number = function(x:number, y: number): number { return x + y };
let myAdd: (baseValue: number, increment: number) => number = function (x: number, y: number): number { return x + y }
=>
을 써서 명시할 수 있다. void
를 써서 표시한다.let myAdd = function(x: number, y: number): number { return x + y; };
// 전체 함수 타입을 가짐
let myAdd: (baseValue: number, increment: number) => number = function(x, y) { return x+ y; };
// 매개변수 x, y 는 number 타입을 가진다.
contextual typing
: 방정식의 한쪽에만 타입이 있어도 타입을 알아낼 수 있는 TS 컴파일러의 타입 추론 형태function buildName (firstName: string, lastName: string) {
return firstName + ' ' + lastName;
}
let result1 = buildName('bob'); // 오류, 매개변수가 적다.
let result2 = buildName('bob', 'jin', 'min'); // 오류 매개변수가 많다.
let result3 = buildName('bob', 'jin');
?
를 붙인다.function buildName (firstName: string, lastName?: string) {
return firstName + ' ' + lastName;
}
let result1 = buildName('bob'); // 지금은 바르게 동작한다.
let result2 = buildName('bob', 'jin', 'min'); // 오류 매개변수가 많다.
let result3 = buildName('bob', 'jin');
undefined
로 했을 때 할당된 매개변수의 값을 정해 놓는 것. 선택적으로 처리 됨, 함수 호출 할 때 생략 가능. 순서는 상관 없음. 순서가 앞에 올 땐 undefined
를 명시적으로 전달 해줘야함.function buildName(firstName: string, lastName = 'Smith') {
return firstName + ' ' + lastName;
}
let result1 = buildName('bob') // 'bob Smith'
let result2 = buildName('bob', undefined); // 'bob Smith'
let result3 = buildName('bob', 'admis', 'jin'); // 오류 너무 많은 매개변수
let result4 = buildName('bob', 'jin'); // 'bob jin'
function buildName2(firstName = 'Will', lastName : string) {
return firstName + ' ' + lastName;
}
let result5 = buildName2(undefined, 'jin') // 'Will Jin'
let result6 = buildName2('jin') // 오류 너무 적은 매개변수
function buildName (firstName: string, lastName?: string)
와 function buildNmae(firstName: string, lastName = 'Smith')
는function buildNmae(firstName: string, lastName = 'Smith')
라는 공통된 타입을 공유한다.
function buildName(firstName: string, ...restOfName: string[]) {
return firstName + ' ' + restOfName.join(' ');
}
let employeeName = buildName('Joseph', 'Jin', 'Sam', 'Min', 'Micle')
console.log(employeeName); //Joseph Jin Sam Min Micle
this
와 화살표 함수에서의 this
는 다르다.this
를 호출한 객체로 바인딩 하지만 ES6 화살표 함수에서는 this
가 상위 컨텍스트에서 캡쳐된다. 쉽게 말해서 한 단계 위에서 this
를 썼다고 생각하면 된다.let cat = {
sound: "meow",
soundPlay: function () {
setTimeout(() => {
console.log(this.sound);
https://github.com/typescript-kr/typescript-kr.github.io }, 1000);
}
}
cat.soundPlay();
// 1초 후에 ... "meow"
this
를 사용할 수 없음.function f(this: void) {
// this 사용 불가능
}
let suits = ["hearts", "spades", "clubs", "diamonds"];
function pickCard(x: { suit: string; card: number; }[]): number;
function pickCard(x: number): { suit: string; card: number; };
function pickCard(x): any { // 오버로드 목록에 해당 안 됨.
if (typeof x == 'object') {
let pickedCard = Math.floor(Math.random() * x.length);
return pickedCard;
} else if (typeof x == 'number') {
let pickedSuit = Math.floor(x / 13);
return { suit: suits[pickedSuit], card: x % 13 }
}
}
let myDeck = [{ suit: 'diamonds', card: 2 }, { suit: 'spades', card: 10 }, { suit: 'hearts', card: 4 }];
let pickedCard1 = myDeck[pickCard(myDeck)];
console.log('card ' + pickedCard1.card + ' of ' + pickedCard1.suit);
let pickedCard2 = pickCard(15);
console.log('card ' + pickedCard2.card + ' of ' + pickedCard2.suit);