전편에 다룬 것 외에 다른 기본 basic type에 대해서 알아보자
//math 의 add의 덧셈 함수의 경우 예시
function add(num1: number, num2: number): number {
return num1 + num2;
}
// JavaScript
function jsFetchNum(id) {
// code..
// code..
return new Promise((resolve, reject) => {
resolve(200);
});
}
// TypeScript
// string인 id를 받아서 Promise를 return 하는데,fetch가 완료된 이후에 숫자의 데이터를 반환하는 것을 예측할 수 있다.
function fetchNum(id: string): Promise<number> {
// code ...
return new Promise((resolve, reject) => {
resolve(200);
});
}
optional parameter
를 사용한다.parameter?: type
과 같이 인자 옆에 물음표를 붙여서 사용가능하다.// 이름을 찍어주는 함수로, 이름과 성이 있을 수도 있지만 어떤 경우는 이름만 출력하는 함수로도 이용하고 싶다고 하면 아래와 같이 optional parameter를 사용하여 활용 가능하다.
function printName(firstName: string, lastName?: string) {
console.log(firstName);
console.log(lastName);
}
printName('Steve', 'Jobs'); // 'Steve', 'Jobs'
printName('heungmin'); // 'Heungmin', undefined(ts 변환뒤 undefined 출력)
printName('kane', undefined); // 'kane', undefined
printName('python', 123) // 뒤에 인자가 숫자임으로 에러
//union type을 활용하여서도 가능하지만 이 경우에는 명시적으로 인자 값에 undefined로 해주어야 한다.
function printName(firstName: string, lastName: string | undefined) {
console.log(firstName);
console.log(lastName);
}
printName('Steve', 'Jobs'); // 'Steve', 'Jobs'
printName('heungmin'); // 이 경우는 에러가 난다. printName("heungmin",undefined)로 명시해주어야 에러가 안남.
printName('kane', undefined); // 'kane', undefined
printName('python', 123) // 뒤에 인자가 숫자임으로 에러
function printMessage(message: string = 'default message') {
console.log(message);
}
printMessage(); // 'default message'
JS에서 사용가능한 rest parameter는 를 typescript에서도...parameter
의 형태로 매개변수를 지정하고, 인수로 여러 개의 값들을 parameter로 받을 수 있다.
그리고 typescript에서는 ...parameter
의 타입을 지정해 줄 수 있다. 즉, 매개변수로 들어올 배열들의 각 요소의 타입을 지정할 수 있다.
// JavaScript
function addNumbers(...numbers) {
return numbers.reduce((a, b) => a + b);
}
// TypeScript
//여러개의 인수를 받을 경우 rest parmter적용 가능
// numbers array의 여러 인수 배열이 들어옴
function addNumbers(...numbers: number[]): number {
return numbers.reduce((a, b) => a + b);
}
console.log(addNumbers(1, 2)); // 3
console.log(addNumbers(1, 2, 3, 4)); // 10
console.log(addNumbers(1, 2, 3, 4, 5, 0)); // 15
console.log(addNumbers(1, '1')); // compile error
const alphabet: string[] = ['a', 'b'];
const scroes: Array<number> = [1, 3, 4];
//readonly를 적용시
const alphabet1: readonly string[] = ["a","b","c"]
const alphabet2: Readonly Array<string> =["a","b","c"]
const alphabet3: Readonly <string[]> = []
readonly
의 경우: 전달된 인자를 함수 내부에서 변경 할 수 없도록 타입에서 보장하도록 표기하는 것// readonly를 추가할 경우 매개변수 alphabet의 값을 읽을 수만 있다.
// alphabet의 값을 수정할 수 없다.
// 아래의 print 함수에서는 push() 같은 메서드를사용할 수가 없다.
function printArray(alphabet: readonly string[]) {}
tuple
에 명시적으로 지정된 형식에 따라 아이템 순서를 설정해야 되고, 추가되는 아이템 또한 tuple
에 명시된 타입만 사용만 가능하다.let student: [string, number];
student = ['name', 123];
student[0]; // name
student[1]; // 123
//object destructuring 활용하여 가독성을 높일 수 있다.
// 그래도 데이터를 사용하는 곳에서 임의로 데이터를 name,age로 설정해줘야 하는 단점이 존재한다.
const [name,age] = student;로
tuple
의 사용은 권장되지 않는다. 위의 경우 인덱스처럼 접근하는 경우 그 인덱스에 어떠한 데이터가 들어간지 모르기 때문에 tuple대신의 class나 object형태로 사용하게 되면 조금 더 명시적으로 접근해서 사용이 가능하다.