TypeSctipt의 Type

TypeScript는 JavaScript와 거의 동일한 데이터 타입을 지원합니다.

타입(Type)
값과 이 값으로 할 수 있는 일의 집합

우선 전체적인 TypeScript의 타입계층도는 아래와 같습니다.

타입계층도

TypeScript는 아래와 같이 변수명 뒤에 콜론을 붙이고 타입을 명시하는 것으로 타입을 선언할 수 있다.

1
let name: string = 'Mishka'

선언한 타입에 맞지 않는 값을 할당하면 컴파일 시점에서 에러가 발생합니다.

계층도에서 본것 같이 JavaScript와 같이 쓰는 타입도 있고 TypeScript에만 있는 타입도 있다.
이 그에서는 TypeScript에만 있는 타입을 중점적으로 알아보겠습니다.

Any

any 타입은 제약이 없는 모든 타입의 최상위 타입으로 어떤 타입의 값도 받아들일 수 있습니다.
일종의 타입 치트키 라고 볼 수 있죠 ㅎㅎ any를 사용하면 JavaScript 처럼 동작하기 시작하고 정적 타입 검사를 하지 않습니다.
그래서 되도록 사용을 지양하고 있습니다.

1
2
let a: any = 123
let b: any = true

정적 타입 검사
정적 타입 검사를 시행하는 언어는 런타임시 타입 검사를 시행하고 맞지 않은 값이 들어있으면 에러가 발생합니다.
그래서 변수에 들어갈 값의 형태에 따가 차입을 지정해주어야 합니다.

Union & Intersection

a 와 b 가 있을 때 둘의 합집합을 union, 둘의 교집합을 intersection 으로 볼 수 있다.

Tuple

tuple 타입은 Array 와 매우 흡사하며 차이점은 n 개의 요소로 이뤄진 배열에 대응하는 타입을 의미합니다.

1
2
let x: [string, number]
x = ["hello", 10]

이런식으로 배열의 사이즈와 각 인덱스의 타입을 강제할 수 있습니다.
사이즈를 벗어난 인덱스를 참조하거나 각 인덱스의 타입과 다른 타입을 재할당 할 수 없습니다.

Interface

interface 는 타입스크립트 여러 객체를 정의하는 일종의 규칙이며 구조로 쓰입니다.
예제와 같이 interface 키워드와 함께 사용합니다.

1
2
3
4
5
6
7
8
9
10
11
interface User {
name: string,
age: number,
isAdult: boolean
}

let user1: User = {
name: 'Mishka',
age: 35,
isAdult: true
};

(?)속성을 같이 사용할 수 있으며 선택적 속성을 정의 하는데 사용합니다. 다시 말해 필수가 아닌 속성을 정의 할때 사용합나디.

1
2
3
4
5
6
7
8
9
10
11
interface User {
name: string,
age: number,
isAdult?: boolean // Optional property
}

// `isAdult`를 초기화하지 않아도 에러가 발생하지 않습니다.
let user2: User = {
name: 'Evan',
age: 123
};

Void

void는 보통 함수에서 반환 값이 없을 때 반환 타입을 표현하기 위해 쓰입니다. : void 위치는 함수가 반환 타입을 명시하는 곳입니다.
void는 어떤 타입도 존재할 수 없음을 나타내기 때문에, any의 반대 타입 같습니다.

1
2
3
function warnMsg(): void {
console.log("Warning message");
}

Unknown

any 처럼 unknown 도 모든 값을 대표 하지만, unknown 의 타입을 검사해 정제하기 전까지는 타입스크립트가 unknown 타입의 값을 사용할 수 없게 강제합니다.

1
let a: unknown = 30

타입스크립트가 무언가의 타입을 unknown 이라고 추론하는 상환은 없고, unknown 을 사용하고자 한다면 명시적으로 설정 해야한다.
unknown 타입이 아닌 값과 비교 할 수 있지만, 특정타입이라고 가정하고 해당 타입에서 지원하는 동작을 수행 할 수는 없다.(사전에 특정타입임을 증명해야한다.)

타입 추론

만약 타입 선언을 생략하면 값이 할당되는 과정에서 동적으로 타입이 결정됩니다. 이를 타입 추론(Type Inference)이라 합니다.

1
let foo = 123; // foo는 number 타입

위 코드를 보면 변수 foo에 타입을 선언하지 않았으나 타입 추론에 의해 변수의 타입이 결정됩니다.
동적 타입 언어는 타입 추론에 의해 변수의 타입이 결정된 후에도 같은 변수에 여러 타입의 값을 교차하여 할당할 수 있지만 정적 타입 언어는 타입이 결정된 후에는 타입을 변경할 수 없습니다.
타입스크립트는 정적 타입 언어이므로 타입 추론으로 타입이 결정된 이후, 다른 타입의 값을 할당하면 에러가 발생합니다.

타입 선언을 생략하고 값도 할당하지 않아서 타입을 추론할 수 없으면 any 타입이 됩니다.
any 타입의 변수는 자바스크립트의 var 키워드로 선언된 변수처럼 어떤 타입의 값도 재할당이 가능하지만
타입스크립트를 사용하는 장점을 없애기 때문에 지양하는 것이 좋습니다.

Reference

https://poiemaweb.com/typescript-typing
https://velog.io/@zeros0623/TypeScript-Basic-Type
https://typescript-kr.github.io/pages/basic-types.html#void
https://heropy.blog/2020/01/27/typescript/
https://hyunseob.github.io/2016/10/02/typescript-basic-type/
https://mishka.kr/2020/03/18/TypeSctipt-3-var/

댓글

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×