기존의 자바스크립트 함수를 타입스크립트로 바꾸려면 중요하다고 생각 되어 지는 부분이라 자세히 알아보려고 한다.
function sum(a, b) {
return a + b;
}
function sum(a: number, b: number): number {
return a + b;
}
매개변수와 함수의 리턴 값의 타입을
:
으로 추가.
(함수의 반환 값에 타입을 정하지 않을 때는 void라도 사용)function sayHi(): void { console.log('Hi') }
function sum(a: number, b: number): number {
return a + b;
}
sum(10, 20); // 30
sum(10, 20, 30); // error, too many parameters
sum(10); // error, too few parameters
function sum(a: number, b?: number): number {
return a + b;
}
sum(10, 20); // 30
sum(10, 20, 30); // error, too many parameters
sum(10); // 타입 에러 없음
타입스크립트에서는 지정된 타입의 지정된 인자를 전달받아야 정상적으로 함수가 실행되지만,
선택적으로 인자를 설정하고 싶은 경우 (파라미터가 전달되지 않아도 함수가 정상적으로 실행되게 하고 싶을 경우) 파리터뒤에 ?
를 작성해주면 된다.
주의
필수 파라미터는 선택적 파라미터보다 먼저 작성되어야 한다.
선택적 파라미터를 먼저 작성하고 싶은 경우에는|
(유니온 타입)과 undefined
를 사용하는 방법이 있다.
//주의사항 1
function sum(a?: number, b: number): number {
return a + b;
}
//error, A required parameter cannot follow an optional parameter.
//주의사항 2
function sum(a: number | undefined, b: number): number {
if(a !== undefined) {
return a + b
} else {
return b
}
}
sum (undefined, 10) //10
function sum(a: number, b = '100'): number {
return a + b;
}
sum(10, undefined); // 110
sum(10, 20, 30); // error, too many parameters
sum(10); // 110
function sum(a: number, ...nums: number[]): number {
const totalOfNums = 0;
for (let key in nums) {
totalOfNums += nums[key];
}
return a + totalOfNums;
}
sum(1) //1
sum(1,2,3) //6
sum(1,2,3,5,6) //17
타입스크립트에서 자바스크립트의 this가 잘못 사용되었을 때 감지할 수 있다.
function 함수명(this: 타입) {
// ...
}
예제
interface User {
name: string
}
const Sam: User = { name:'Sam' }
//에러가 발생하게 되는 곳
function showName() {
console.log(this.name)
}
const a = showName.bind(Sam);
a(); //errors, 'this' implicitly has type 'any' because it does not have a type annotation.
showName
함수에 Sam
객체를 바인드해서 this.name을 콘솔에 출력하는 a 함수가 있다.아래와 같이 고치면 this에 타입을 지정했기 때문에 에러가 나지 않는다.
interface User {
name: string
}
const Sam: User = { name:'Sam' }
// this에 타입을 지정
function showName(this:User) {
console.log(this.name)
}
//this를 Sam 객체로 강제 바인딩한 것임
const a = showName.bind(Sam);
a(); //'Sam'
interface User {
name: string
}
const Sam: User = { name:'Sam' }
function showName(this:User, age:number) {
console.log(this.name, age)
}
const a = showName.bind(Sam);
a(27); //'Sam', 27
오버로드
해줘야 한다.interface User {
name: string;
age: number;
}
function join(name:string, age:string): string;
function join(name:string, age:number): User;
//만약 age로 number를 받거나 string을 받는다면
// 위 처럼 함수를 오버로드 해줘야한다.
function join(name:string, age:number | string): User | string {
if(typeof age === "number"){
return{
name,
age,
};
} else {
return "나이는 숫자로 입력해주세요."
}
}
const sam: User = join("Sam", 30);
const jane: string = join("Jane", "30");