자바스크립트는 타입 시스템이 없는 동적 프로그래밍 언어로, 자바스크립트 변수는 문자열, 숫자, 불린 등 여러 타입의 값을 가질 수 있다.
이를 약한 타입 언어라고 표현할 수 있으며 비교적 유연하게 개발할 수 있는 환경을 제공하는 한편 런타임 환경에서 쉽게 에러가 발생할 수 있는 단점을 가진다.(런타임 - 컴퓨터가 실행되는 동안 프로세스나 프로그램을 위한 소프트웨어 서비스를 제공하는 가상 머신의 상태이다.)(컴파일 언어 - 어떤 언어 코드를 다른 언어로 바꿔주는 과정)
그리고 타입스크립트는 이러한 자바스크립트에 강한 타입 시스템을 적용해 대부분의 에러를 컴파일 환경에서 코드를 입력하는 동안 체크할 수 있다.
VSCode와 WebStorm
타입 기본(Types)
타입스크립트는 일반 변수, 매개 변수(Parameter), 객체 속성(Property)드으에 :type
과 같은 형태로 타입을 지정한다.
function someFunc(a: TYPE_A, b: TYPE_B): TYPE_RETURN {
return a + b;
}
let some: TYPE_SOME = someFunc(1, 2);
다음 예시를 보면
add함수의 매개 변수 a와 b는 number 타입이어야 한다고 지정했고, 그렇게 실행된 함수의 반환값은 숫자로 추론(Inference)되기 때문에 변수 sum도 number타입이어야 한다고 지정.
function add(a: number, b: number) {
return a + b;
}
const sum: number = add(1, 2);
console.log(sum); // 3
자바스크립트로 컴파일한 결과
"use strict";
function add(a, b) {
return a + b;
}
const sum = add(1, 2);
console.log(sum);
만약 다음과 같이 변수 sum
을 number
가 아닌 string
타입이어야 한다고 지정했다면, 컴파일조차 하지 않고 코드를 작성하는 시점에서 에러 발생
ex) TS2323라는 에러 뜬다 이거 그대로 구글 검색하면 에러코드 정보얻을수있음
불린:Boolean
단순한 참(true)/거짓(false) 값을 나타낸다.
let isBoolean: boolean;
let isDone: boolean = false;
숫자: Number
모든 부동 소수점 값을 사용할 수 있다.
ES6에 도입된 2진수 및 8진수 리터럴도 지원함
let num: number;
let integer: number = 6;
let float: number = 3.14;
let hex: number = 0xf00d; // 61453
let binary: number = 0b1010; // 10
let octal: number = 0o744; // 484
let infinity: number = Infinity;
let nan: number = NaN;
문자열: String
문자열을 나타낸다.
작은따옴표('), 큰따옴표(") 뿐만 아니라 ES6의 템플릿 문자열도 지원한다.
let str: string;
let red: string = 'Red';
let green: string = "Green";
let myColor: string = `My color is ${red}.`;
let yourColor: string = 'Your color is' + green;
배열
순차적으로 값을 가지는 일반 배열을 나타낸다.
배열은 다음과 같이 두 가지 방법으로 타입 선언 가능
//문자열만 가지는 배열
let fruits: string[] = ['Apple', 'Banana', 'Mango'];
//Or
let fruits: Array<string> = ['Apple', 'Banana', 'Mango'];
// 숫자만 가지는 배열
let oneToSeven: number[] = [1, 2, 3, 4, 5, 6, 7];
// Or
let oneToSeven: Array<number> = [1, 2, 3, 4, 5, 6, 7];
유니언 타입(다중 타입)의 '문자열과 숫자를 동시에 가지는 배열'도 선언할 수 있다.
let array: (string | number) [] = ['Apple', 1, 2, 'Banana', 'Mango', 3];
//Or
let array: Array<string | number> = ['Apple', 1, 2, 'Banana', 'Mango', 3];
배열이 가지는 항목의 값을 단언할 수 없다면 any
를 사용할 수 있다.
let someArr: any[] = [0, 1, {}, [], 'str', false];
인터페이스(Interface)나 커스텀 타입(Type)을 사용할 수 있다.
interface IUser{
name: string,
age: number,
isValide: boolean
}
let userArr: IUser[] = [
{
name: 'Neo',
age: 85,
isValid: true
},
{
name: 'Lewis',
age: 52,
isValid: false
},
{
name: 'Evan',
age: 36,
isValid: true
}
];
유용하진 않지만, 다음과 같이 특정한 값으로 타입을 대신해서 작성할 수도 있다.
let array = 10[];
array = [10];
array.push(10);
array.push(11); // Error - TS2345
읽기 전용 배열을 생성할 수도 있다.
readonly
키워드나 ReadonlyArray
타입을 사용하면 된다.
let arrA: readonly number[] = [1, 2, 3, 4];
let arrB: ReadonlyArray<number> = [0, 9, 8, 7];
arrA[0] = 123; // Error - TS2542: Index signature in type 'readonly number[]' only permits reading.
arrA.push(123); // Error - TS2339: Property 'push' does not exist on type 'readonly number[]'.
arrB[0] = 123; // Error - TS2542: Index signature in type 'readonly number[]' only permits reading.
arrB.push(123); // Error - TS2339: Property 'push' does not exist on type 'readonly number[]'.
튜플: Tuple
Tuple 타입은 배열과 매우 유사하닫.
차이점이라면 정해진 타입의 고정된 길이(length) 배열을 표현한다.
let tuple: [string, number];
tuple = ['a', 1];
tuple = ['a', 1, 2]; // Error - TS2322
tuple = [1, 'a']; // Error - TS2322
다음과 같이 데이터를 개별 변수로 지정하지 않고, 단일 Tuple 타입으로 지정해 사용할 수 있다.
// Variables
let userId: number = 1234;
let userName: string = 'HEROPY';
let isValid: boolean = true;
// Tuple
let user: [number, string, boolean] = [1234, 'HEROPY', true];
console.log(user[0]); // 1234
console.log(user[1]); // 'HEROPY'
console.log(user[2]); // true
나아가서 위 방식을 활용해서 다음과 같은 Tuple 타입의 배열(2차원 배열)을 사용할 수 있다.
let users: [number, string, boolean][];
// Or
// let users: Array<[number, string, boolean]>;
users = [[1, 'Neo', true], [2, 'Evan', false], [3, 'Lewis', true]];
역시 값으로 타입을 대신할 수 있다.
let tuple: [1, number];
tuple = [1, 2];
tuple = [1, 3];
tuple = [2, 3]; // Error - TS2322: Type '2' is not assignable to type '1'.
Tuple은 정해진 타입의 고정된 길이 배열을 표현하지만, 이는 할당(Assign)에 국한된다.
.push()
나 .splice()
등을 통해 값을 넣는 행위는 막을 수 없다.
let tuple: [string, number];
tuple = ['a', 1];
tuple = ['b', 2];
tuple.push(3);
console.log(tuple); // ['b', 2, 3];
tuple.push(true); // Error - TS2345: Argument of type 'true' is not assignable to parameter of type 'string | number'.
배열에서 사용한 것과 같이 readonly
키워드를 사용해 읽기 전용 튜플을 생성할 수도 있다.
let a: readonly [string, number] = ['Hello', 123];
a[0] = 'World'; // Error - TS2540: Cannot assign to '0' because it is a read-only property.
열거형 Enum
Enum은 숫자 혹은 문자열 값 집합에 이름(Member)을 부여할 수 있는 타입으로, 값의 종류가 일정한 범위로 정해져 있는 경우 유용.
기본적으로 0부터 시작하며 값은 1씩 증가
enum Week {
Sun,
Mon,
Tue,
Wed,
Thu,
Fri,
Sat
}
수동으로 값 변경 가능하고 값을 변경한 부분부터 다시 1씩 증가.
Enum타입의 재밌는 부분은 역방향 mapping 지원
이것은 열거된 멤버로 값에, 값으로 멤버에 접근할 수 있다는 것을 의미.
enum Week {
// ...
}
console.log(Week);
console.log(Week.Sun); // 0
console.log(Week['Sun']); // 0
console.log(Week[0]); // 'Sun'
추가로 enum은 숫자 값 열거뿐만 아니라 문자열 값으로 초기화 할 수 있다. 이 방법은 역방향 맵핑 불가능 개별적으로 초기화해야함.
enum Color {
Red = 'red',
Green = 'green',
Blue = 'blue'
}
console.log(Color.Red); // red
console.log(Color['Green']); // green
모든 타입 : Any
Any는 모든 타입 의미.
따라서 일반적인 자바스크립트 변수와 동일하게 어떤 타입의 값도 할당 가능
외부 자원을 활용해 개발할 때 불가피하게 타입을 단언할 수 없는 경우, 유용하다.
let any: any = 123;
any = 'Hello world';
any = {};
any = null;
다양한 값을 포함하는 배열을 나타낼 때 사용할 수도 있다.
const list: any[] = [1, true, 'Anything!'];