타입스크립트 기본
타입스크립트 기본 타입
number, string, boolean, null, undefined
// type annotation
// number
let num1: number = 123;
let num2: number = -123;
let num3: number = 0.123;
let num4: number = -0.123;
let num5: number = Infinity;
let num6: number = -Infinity;
let num7: number = NaN;
// number 관련 메서드만 사용 가능
num1.toFixed();
// string
let str1: string = "hello";
let str2: string = "hello";
let str3: string = `hello`;
let str4: string = `hello ${num1}`;
// boolean
let bool1: boolean = true;
let bool2: boolean = false;
// null
let null1: null = null;
// undefined
let unde1: undefined = undefined;
// 리터럴 타입 (값으로 만든 타입)
// 다른 값 넣을 수 없음
let numA: 10 = 10;
let strA: "hello" = "hello";
let boolA: true = true;
원시타입과 리터럴타입
// 배열
let numArr: number[] = [1, 2, 3];
let strArr: string[] = ["hello", "hi"];
// <> 제너릭
let boolArr: Array<boolean> = [true, false, true];
// 배열에 들어가는 요소들의 타입이 다양할 경우
let multiArr: (string | number)[] = [1, "hello", "hi"];
// 다차원 배열의 타입을 정의하는 방법
let doubleArr: number[][] = [
[1, 2, 3],
[4, 5],
];
// 튜플
// JS x, TS에서만 지원
// 길이와 타입이 고정된 배열
let tup1: [number, number] = [1, 2];
let tup2: [number, string, boolean] = [1, "2", true];
// 배열 메서드를 사용하면 TS 타입 체크 x => 사용 주의
tup1.push(1);
tup1.pop();
tup1.pop();
tup1.pop();
const users: [string, number][] = [
["이정환", 1],
["이아무개", 2],
["김아무개", 3],
["박아무개", 4],
];
객체
// 객체 리터럴 타입
// 구조를 기준으로 타입 정의 => 구조적 타입 시스템 (= Property Based Type System)
// 이름만을 기준으로 타입 정의 => 명목적 타입 시스템 (C, Java 등)
let user: {
id?: number;
name: string;
} = {
id: 1,
name: "레이첼",
};
let cat: {
name: string;
color: string;
} = {
name: "깜냥이",
color: "black",
};
user.id;
cat.color;
user = {
name: "김김김",
};
// readonly => Property의 값 수정 불가 ex) config.apiKey = "" 불가
let config: {
readonly apiKey: "MY API KEY";
} = {
apiKey: "MY API KEY",
};
타입 별칭과 인덱스 시그니처
// 타입 별칭
type User = {
id: number;
name: string;
nickname: string;
birth: string;
bio: string;
location: string;
};
function func() {
// 함수 영역 내에서만 type 정의됨
type User = {};
}
let user: User = {
id: 1,
name: "Rachel",
nickname: "Rachel Pink",
birth: "2023.06.30",
bio: "안녕하세요",
location: "South Korea",
};
// 인덱스 시그니처
// key, value type 기준을 이용해 객체 타입 정의
type CountryCodes = {
[key: string]: string;
};
let countryCodes: CountryCodes = {
Korea: "ko",
UnitedState: "us",
UnitedKingdom: "uk",
};
type CountryNumberCodes = {
[key: string]: number;
// 필수 명시
Korea: number;
};
let countryNumberCodes: CountryNumberCodes = {
Korea: 410,
UnitedState: 840,
UnitedKingdom: 826,
};
Enum 타입
// 여러가지 값들에 각각 이름을 부여해 열거해두고 사용하는 타입
const user1 = {
name: "이정환",
role: 0, // 0 <= 관리자
};
const user2 = {
name: "Rachel",
role: 1, // 1 <= 일반 유저
};
const user3 = {
name: "아무개",
role: 2, // 2 <= 게스트
};
// 위 코드를 enum을 활용해 표시, 숫자형 enum
// enum은 컴파일 결과 사라지지 x
enum Role {
ADMIN = 0,
USER = 1,
GUEST = 2,
}
const user1 = {
name: "이정환",
role: Role.ADMIN,
};
const user2 = {
name: "Rachel",
role: Role.USER,
};
const user3 = {
name: "아무개",
role: Role.GUEST,
};
console.log(user1, user2, user3);
// { name: '이정환', role: 0 } { name: 'Rachel', role: 1 } { name: '아무개', role: 2 }
// 잘 할당된 것을 확인할 수 있다.
// enum Role {
// ADMIN,
// USER,
// GUEST,
// }
// + 숫자 할당을 해주지 않아도 자동으로 0, 1, 2 할당된다.
// + ADMIN = 10으로 힐당해주면 밑은 자동으로 11, 12로 할당
// + 중간 USER = 10을 할당해주면 ADMIN = 0, GUEST = 11으로 자동 할당
enum Language {
korean = "ko",
english = "en",
}
const user4 = {
language: Language.korean,
};
Any와 Unknown 타입
// any: 특정 변수의 타입을 우리가 확실히 모를 때 사용 => 어떤 타입이던지
let anyVar: any = 10;
anyVar = "hello";
anyVar = true;
anyVar = {};
anyVar = () => {};
// 런타임에 TypeError 발생 => TS 이점을 활용하지 못하므로 any 사용 주의
anyVar.toUpperCase();
anyVar.toFixed();
let num: number = 10;
num = anyVar;
// unknown, 아무 타입의 값이나 넣을 수 있음
let unknownVar: unknown;
unknownVar = "";
unknownVar = 1;
unknownVar = () => {};
// any와 차이점: unknown타입에 모든 값을 저장할 순 있지만 반대로는 안된다
// 즉, unknown 타입의 값을 다른 곳에 집어 넣을 수 없음 + 메서드 사용 x + 연산(+, -, *, / 등) x
// num = unknownVar; (x)
// => unknown 타입의 값을 활용하고 싶다면 조건문으로 unknown 타입인 변수의 타입을 확실하게 확인했을 때만 사용 가능
// 이런 과정을 "타입 정제"라고 한다
if (typeof unknownVar === "number") {
num = unknownVar;
}
// 변수의 타입이 확실하지 않다면 any타입보다 좀 더 안전한 unknown 타입을 사용하는 것이 좋다
Void와 Never 타입
// void => 공허 => 아무것도 없음을 의미하는 타입
function func1(): string {
return "hello";
}
// 반환 x => void
function func2(): void {
console.log("hello");
}
let a: void;
// a = 1;
// a = "hello";
// a = {};
// void타입은 오직 undefined만 담을 수 있다
a = undefined;
// (tsconfing.js) "strictNullChecks": false 하면 null도 집어넣을 수 있음
// never
// 존재하지 않는, 불가능한 타입, 모순
// 무한 루프 함수는 반환을 할 수가 없으므르(정상적으로 종료 x) never 타입 선언
function fun3(): never {
while (true) {}
}
// 실행되면 바로 프로그램 종료하므로 never 타입 선언
function fun4(): never {
throw new Error();
}
// 변수를 never로 설정하면 다른 모든 값(number, object, null, string, undefined 등)을 담을 수 없다
// + any 타입의 변수도 x
let b: never;
// b = 1;
[참고]
- Section 2. 타입스크립트 기본 강의를 듣고 정리한 내용입니다.
'프로그래밍 > TypeScript' 카테고리의 다른 글
타입스크립트 클래스 (1) | 2023.10.23 |
---|---|
타입스크립트 인터페이스 (0) | 2023.10.23 |
타입스크립트 함수와 타입 (0) | 2023.10.18 |
타입스크립트 이해하기 (0) | 2023.10.18 |
TypeError [ERR_UNKNOWN_FILE_EXTENSION] Unknown file extension ".ts” 해결 (0) | 2023.10.04 |