
자바스크립트는 전세계의 97% 이상의 웹사이트에서 사용되고 있는 만큼 가장 인기 있는 프로그래밍 언어 중에 하나이다.
자바스크립트는 웹사이트를 동적으로 만들 수 있고 다른 복잡한 기능들을 구현가능하게 해주기 때문에 웹사이트에서는 거의 필수적인 존재라고 볼 수 있다.
하지만 타입 또한 동적으로 결정되기 때문에 (변수의 타입이 런타임 중에 결정되므로) 개발자가 의도하지 않은 타입 변환으로 인해 버그가 발생할 수 있다.
아래 코드를 예시로 보자.
function add(var1, var2){
return var1 + var2
}
console.log(add(1, 2)) // 3
console.log(add(1, '2')) // 12 (문자열 결합)
함수 add는 두 개의 인자를 받아와서 덧셈 연산을 수행하는 함수이다.
만약 파라미터로 숫자 타입과 문자열 타입의 인자가 함께 들어가면 숫자를 문자열로 암묵적으로 변환하여 문자열 ‘12’를 출력한다.
이런 암묵적인 타입 변환이 예상치 못한 동작을 초래할 수 있으며, 디버깅과 유지보수를 어렵게 만들 수 있다.
물론 아래와 같이 타입을 체크하는 함수를 만들 수도 있지만, 이 또한 코드를 실행시키기 전에는 오류를 확인할 수 없다.
function addTypeSafe(num1, num2) {
if (typeof num1 === 'number' && typeof num2 === 'number') {
return num1 + num2;
} else {
throw Error('숫자만 파라미터에 입력해주세요.')
}
}
console.log(addTypeSafe(1, 2)) // 3
console.log(addTypeSafe(1, '2')) // Error 발생 (타입 체크)
반면 TypeScript는 정적 타입 체계를 도입하여 개발자가 변수의 타입을 명시할 수 있어 잘못된 타입간의 연산이나 할당을 사전에 방지하여 런타임 에러를 줄일 수 있다.
function add(num1: number, num2: number){
return num1 + num2;
}
console.log(add(1, 2)) // 3
console.log(add(1, '2')) // 오류: Argument of type '"2"' is not assignable to parameter of type 'number'.
이제 타입스크립트에 대해 공부해보자..!!
컴퓨터에 Node.js가 설치되어 있으면 타입스크립트를 실행할 수 있다.
타입스크립트를 설치하기 위해서는 다음 명령어 실행
npm install –g typescript // 현재 컴퓨터에 설치
npm install typescript // 로컬로 설치(현재 위치의 폴더에 설치)
$ sudo npm install -g typescript // 현재 컴퓨터에 설치
$ sudo npm install typescript // 로컬로 설치(현재 위치의 폴더에 설치)
tsc --init
타입스크립트 코드에서 어떤 변수 또는 값의 타입을 표기하기 위해 타입 표기를 사용한다. 타입 표기는 식별자 또는 값 뒤에 콜론(:)을 붙여 value: type 의 형태로 표기한다.
null; // null
undefined; // undefined
true; // boolean
"Louise"; // string
1337; // number
1337n; // bigint
Symbol("Franklin"); // symbol
let isDone: boolean = false;
let decimal: number = 6;
let hex: number = 0xf00d;
let binary: number = 0b1010;
let octal: number = 0o744;
")나 작은따옴표 (')를 문자열 데이터를 감싸는데 사용let color: string = "blue";
color = 'red';
) 문자로 감싸지며, ${ expr }`과 같은 형태로 표현식을 포함let fullName: string = `Bob Bobbington`;
let age: number = 37;
let sentence: string = `Hello, my name is ${ fullName }.
I'll be ${ age + 1 } years old next month.`;
[]를 쓰거나 제네릭 배열 타입을 써서 사용let list: number[] = [1, 2, 3];
let list: Array<number> = [1, 2, 3];
// 튜플 타입으로 선언
let x: [string, number];
// 초기화
x = ["hello", 10]; // 성공
// 잘못된 초기화
x = [10, "hello"]; // 오류
console.log(x[0].substring(1)); // 성공
console.log(x[1].substring(1)); // 오류, 'number'에는 'substring' 이 없습니다.
x[3] = "world"; // 오류, '[string, number]' 타입에는 프로퍼티 '3'이 없습니다.
console.log(x[5].toString()); // '[string, number]' 타입에는 프로퍼티 '5'가 없습니다.
enum은 값의 집합에 더 나은 이름을 붙여줄 수 있음.enum Color {Red, Green, Blue}
let c: Color = Color.Green;
enum은 0부터 시작하여 멤버들의 번호를 매기지만, 멤버 중 하나의 값을 수동으로 설정하여 번호를 바꿀 수 있음.0대신 1부터 시작해 번호를 매기도록 바꿀 수 있음.enum Color {Red = 1, Green, Blue}
let c: Color = Color.Green;
enum Color {Red = 1, Green = 2, Blue = 4}
let c: Color = Color.Green;
2라는 값이 위의 어떤 Color enum 멤버와 매칭되는지 알 수 없을 때, 이에 일치하는 이름을 알아낼 수 있습니다:enum Color {Red = 1, Green, Blue}
let colorName: string = Color[2];
console.log(colorName); // 값이 2인 'Green'이 출력됩니다.
let anyVar: any;
anyVar = 100;
anyVar = '문지은';
anyVar = true;
let testNumber: number = anyVar;
let testString: string = anyVar;
let testBoolean: boolean = anyVar;
let unknownType: unknown;
unknownType = 100;
unknownType = 'unknown';
unknownType = true;
let testNumber2: number = unknownType;
// 오류 : 'unknown' 형식은 'number' 형식에 할당할 수 없습니다.
function warnUser(): void {
console.log("This is my warning message");
}
// never를 반환하는 함수는 함수의 마지막에 도달할 수 없다.
function error(message: string): never {
throw new Error(message);
}
// 반환 타입이 never로 추론된다.
function fail() {
return error("Something failed");
}
// never를 반환하는 함수는 함수의 마지막에 도달할 수 없다.
function infiniteLoop(): never {
while (true) {
}
}
References
[Typescript] 타입스크립트를 "사용해야 하는" 이유 (+ 온라인에서 연습하기)
[TypeScript]타입스크립트 any, unknown 차이
https://typescript-kr.github.io/pages/basic-types.html
https://ahnheejong.gitbook.io/ts-for-jsdev/03-basic-grammar/primitive-types