
🔷 타입이 적용된 자바스크립트
⭐ 장점
안정성
가독성
⭐ 단점
초기 설정을 해야한다.
타입이 강제되다 보니 스크립트 언어의 유연성이 낮아진다.
컴파일 시간이 길어질 수 있다.
단점이 이러니저러니해도 타입 스크립트의 장점이 매우 강하여 자주 쓰인다.
타입 주석은 변수, 상수 혹은 반환 값이 무슨 타입인지를 나타내는 것.타입 추론은 해당 변수가 어떤 타입인지 추론하는 것. 생략하면 컴파일 타임에 알아낸다.// 타입 주석
let a: number = 1;
let c: boolean = false;
let d: string = 'TypeScript';
let f = { a: 1 };
f.a = 2;
// f.b = 3; => 오류 발생
let h: number[] = [];
// 특정 값을 타입으로 사용 가능, 이 경우에는 값이 타입으로 사용한 값으로 한정됨
let i: 'good' = 'good';
// 어떤 값이든 가능한 any, 남발하지 않는 것이 좋다.
let g: any = 3;
g = '1';
g = 3;
g= false;
// 함수의 매개변수와 리턴 값에도 타입을 지정해줄 수 있다.
function add(a: number, b: number): number {
return a + b;
};
// 타입 추론
let b = 2;
// b = 'a'; => 오류 발생
interface라는 키워드로 사용한다.// 인터페이스
// 속성 뒤에 ?를 붙이면 선택 속성으로서 undefined 속성으로 취급할 수 있다.
// 이를 Optional이라 부른다.
interface Company {
name: string;
age: number;
address?: string;
}
const naver: Company = {
name: 'Naver',
age: 20,
// address: 'Seoul' => 생략 가능
}
// 익명 인터페이스
const person: {
name: string,
age?: number
} = {
name: '박영규',
age: 26
}
Tuple로 이용한다.// tuple
// 리스트에 들어갈 수 있는 값을 제한하여 튜플을 흉내낼 수 있다.
const tuple: [string, number] = ['박영규', 26];
// enum
// 코드 가독성이 좋아진다.
// 값을 지정해주어 커스터마이징을 할 수도 있다.
enum Color {
RED = 'red',
GREEN = 'green',
BLUE = 'blue'
};
const color = Color.BLUE;
if(color === Color.BLUE) {
// 코드
}
// 대수 타입 중 합집합 타입
let numOrStr: number | string = 1;
numOrStr = 'str';
// 대수 타입 중 교집합 타입
// let numAndStr: number & string = ''; => 불가능, 즉 원시 타입에서는 사용할 수는 없다.
// 인터페이스에서 주로 활용된다.
interface Name {
name: string
}
interface Age {
age: number;
}
let gue: Name & Age = {
name: '박영규',
age: 26
};
// 인터페이스에서 합집합 타입을 사용하면 optional로 사용이 가능하다.
let gue2: Name | Age = {
name: '박영규'
};
// 대수 타입과 type 키워드를 통해 타입을 만들어낼 수도 있다.
type Person = Name & Age;
let sue: Person = {
name: 'sue',
age: 20
}
// optional을 인터페이스에서 응용하기
interface Post {
title: string;
content: string;
}
interface ResponseData {
post?: Post;
message?: string;
status: number;
}
const response: ResponseData[] = [
{
post: {
title: 'Hi!',
content: 'Hello!!!'
},
status: 200
},
{
message: 'Error!',
status: 500
}
];
console.log(response[1].post && response[1].post.title); // optional 이전의 방식
console.log(response[0].post?.title); // 데이터가 없다면 자동으로 undefined를 반환한다.
console.log(response[0].post!.title); // 반대로 무조건 값이 있어야한다고 설정할 수도 있다.
// Generic
// 꺽쇠 안에 타입을 넣어 지정해줄 수 있다.
interface Value<T> {
value: T;
}
const value: Value<number> = {
value: 1
}
// 함수에도 사용할 수 있다.
function toString<T>(a: T): string {
return `${a}`;
}
interface User {
id: number;
name: string;
age: number;
address: string;
createdAt?: string;
updatedAt?: string;
}
// Partial: 모든 필드가 Optional이 된다.
const partial: Partial<User> = {}
// Reqired: 모든 필드가 Required가 된다.
const required: Required<User> = {
id: 1,
name: 'Lee',
age: 0,
address: 'Seoul',
createdAt: 'string',
updatedAt: 'string',
}
// Pick: 특정 필드만 골라서 사용할 수 있다.
const pick: Pick<User, 'name' | 'age'> = {
name: 'gue',
age: 26
}
// Omit: 특정 필드만 빼고 사용할 수 있다.
const omit: Omit<User, 'id' | 'createdAt' | 'updatedAt'> = {
name: '',
age: 0,
address: ''
}
// 혼합해서 응용할 수 있다.
const mixed: Omit<User, 'id' | 'address' | 'age' | 'createdAt' | 'updatedAt'> & Pick<Partial<User>, 'address' | 'age'> = {
name: '',
}
// extends
// 인터페이스 상속 개념 예시
interface Time {
hour: number;
minute: number;
second: number;
}
interface DateTime extends Time {
year: number;
month: number;
day: number;
}
interface OffsetDateTime extends DateTime {
offset: number;
}
interface TimeFormat extends Pick<Time, 'hour' | 'minute'> {
ampm: 'am' | 'pm';
}
const timeFormat: TimeFormat = {
hour: 10,
minute: 30,
ampm: 'am'
}
낯선 타입스크립트에게서 익숙한 맛이 난다.
자바의 맛이리라.