TypeScript (타입 정리)

2023. 6. 8. 09:06TypeScript

코딩은 주로 Input(입력) → Operation(연산) → Output(출력)으로 이루어 진다.

또한 프로그램이 동작하기 까지 코딩 → 컴파일 → 런타임 단계로 이루어 진다.

 

자바스크립트는 자유도가 매우 높다고 생각한다.

프론트엔드 개발자라면 자바스크립트를 필수적으로 사용해야한다.

 

그로 인해 발생되는 에러 또한 코딩을 할때는 잘 모르고 런타임 환경 즉 유저가 서비스를 이용하는 환경에서 에러를 발생한다.

에러는 개발자는 보며 수정을 할 수 있지만 사용하는 사용자 입장에서는 에러는 절대 마주치지 않아야 한다.

하지만 타입스크립트는 컴파일 단계 즉 우리가 작성한 코드를 프로그램이 동작할 수 있는 환경으로 바꾸어주는 단계에서 잘못 작성한 코드에 대한 에러를 뱉어준다.

즉 안전하게 코딩을 할 수 있게 도와준다.

기존에 자바스크립트를 사용해왔다면 타입에 관한 이해는 수월 할 것이라고 생각이 든다.

 

| 기본타입

주로 자바스크립트에서 우리가 항상 사용했던 타입이다.

// number
const num: number = 123;

// string
const str: string = '김지후';

// boolean
const boal: boolean = true;

//undefined
const und: undefined = undefined; // undefined 로 타입을 잡아버리면 앞으로도 undefined 로만 사용할수 있어서 불필요하다.
const a: number | undefined = 1; // 이렇게 이 값에는 숫자랑 undefined 가 들어갈 수 있다고 정해 줄 수 있다.

// null
let person: null = null; // undefined 와 마찬가지로 null만 담을수 있는 변수는 굳이 필요가 없다.
let person2: null | string = '김지후';

//function
function abc(): number | undefined {
    return 1;
} // 함수에도 타입을 지정할 수 있다. 무조건 숫자나 undefined를 리턴하는 함수이다 라는 뜻이다.

// unknown
let notSure: unknown = 1;
notSure = '김지후';
notSure = false;
// 그냥 자바스크립트다. 아무 타입이 모두 들어갈 수 있다. 그러다 보니 본연의 타입스크립트의 장점이 따로 없다.

// any
let anyThing: any = 1;
anyThing = 'name';
anyThing = true;
// unknown 과 기능이 동일하다. 최대한 방법이 없을 때 사용하자

// void
function func(): void {
    return;
} // 아무것도 return 하는게 없을 때 사용. 함수에만 사용되며 사용하지 않아도 무관.

// never
function throwError(message: string): never {
    while (true) {

    }
} // 함수가 끝나지 않아야 될 때만 사용. 거의 사용할 일이 없어보인다.

let obj: object;
function objFuc(obj: object) {
} // 배열, 객체 등을 담을 수 있는 타입. 주로 사용하지 않으며 비원시타입중에서도 타입을 따로 지정 해주는게 관습이다.

 

| 배열 (Array)

// 배열의 선언방법 두가지
const friend: string[] = ['김지후', '김진원', '강상희'];
const age: Array<number> = [1, 3, 4, 5];

// 읽을수만 있는 변경할 수 없는 배열 
const name: readonly string[] = ['김지후', '강상희', '김진원'];
// readonly 를 적어주면 읽을수만 있는 배열이 된다. 즉 push나 splice등의 배열의 내장함수 (배열에 요소가 변경되는) 는 사용할 수 없다.

// Tuple
// 타입이 다른 요소들을 담을 수 있다. 
const userList: [string, number] = ['김지후', 25];

const [userName, userAge] = userList;
// 비구조화 할당을 통해 값을 가져올 수 있다.
// 하지만 잘 사용하지 않으며 type alias 나 interface를 선호하는 편이다.

 

| Type alias

새로운 타입을 내가 정할 수 있다.

즉 타입을 변수처럼 사용해서 값을 할당 할 수 있다.

 

type Text = string;
const name: Text = '김지후';
const address: Text = '서울';

type Num = number;
const age: Num = 25;

type Student = {
	name: Text,
  age: Num;
}

const student: Student = {
  name: "김지후",
  age: 25
}

 

| Union Type

or 연산자 처럼 안에 들어갈 값이 내가 지정해놓은 값과 다르면 에러를 뱉는다.

type Friend = '김지후' | '강상희' | '김진원' | '홍장훈';

const myFriend = (friend: Friend) => {
    console.log(friend);
}

myFriend(`강상희`); // output: 강상희
myFriend(`뽀로로`) // Error

 

| Intersection 타입

Union 타입 같은 경우 발생 할 수 있는 것 중 한가지만 있어도 가능하지만

Intersection 타입은 그 모든것이 일치해야 한다.

 

type Friend= {
	name: string,
	age: number
}

type Worker = {
	name: number,
	work: () => void
}

const internWork = (person: Student & Worker) => {
	console.log(person.name, person.empolyeeId, person.score, person.work());
}

// intersection 을 사용하면 사용 된 타입의 모든 객체의 값을 불러와야 한다.

internWork({
	name: "김지후",
	score: 15,
	empolyeeId: 13,
	work: () => console.log("나는 일해")
})

 

| enum (권장하지 않음)

타입스크립트에서는 자주 사용하지 않는다.

그 이유는 안전을 중요시 해서 사용하는 타입스크립트인데 재 할당이 가능하다.

 

enum Animal {
	Cat, // 0
	Monkey, // 1
	Tiger // 2
}

let myAnimal = Animal.Cat;

// 재 할당이 가능
myAnimal = 3