3. typescript - 타입

2020. 2. 27. 23:55typescript/typescript-grammar

js와는 다르게 typescript에는 각 변수 및 파라미터, 함수에 타입이 활용된다. 그럼 이번 포스터를 통해 타입을 간단하게 정리해보겠습니다. 

 

Boolean

let isDone: boolean = false;
isDone = true;

 

Number

number타입은 소수든 정수든 상관없이 사용할 수 있습니다. 그리고 10진수 뿐만아니라 2진수, 8진수, 16진수 등을 사용할 수 있습니다. 

let decimal: number = 10;
let hex: number = 0xf00d;
let binary: number = 0b1010;
let octal: number = 0o744;

 

String 

string은 기존의 웹사이트를 개발할 때 필수적으로 필요합니다. js와 같이 ", '을 사용할 수 있으며 `도 사용할 수 있습니다. 

let color: string = "blue";
color = "red";

// js와 같이 `와 ${}를 사용하여 변수를 집어 넣을 수 있습니다.
let age: number = 24;
let fullName: string = "hoony";
let introduce: string = `my name is ${fullName} my age is ${age}`

 

Array 

당연하지만 js와 같이 array를 사용할 수 있다. 선언 방법은 두가지가 있다. []와 generic을 사용한 방법이 있습니다. 

type[] 또는 Array<type> 등으로 선언할 수 있다.

let list: number[] = [1, 2, 3, 4, 5];
let list2: Array<number> = [1, 2, 3, 4, 5];

 

Tuple

고정된 수 만큼의 데이터를 표현할 수 있습니다. 어떤 타입이든 상관 없습니다. 

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

x = [10, "hello"]; // Error Type 'number' is not assignable to type 'string'.

딱 타입을 맞추어서 데이터를 넣어주어야 합니다.

 

또는 문자열을 인덱싱 해줄 때 숫자를 인덱싱 해주면 아래와 같은 에러가 생깁니다. 

console.log(x[0].substring(0));
console.log(x[1].substring(0)); // Error Property 'substring' does not exist on type 'number'.

 

현재 크기 2개를 지정하여 사용할 수있는데 숫자를 넘어서서 참조 혹은 대입을 하게되면 에러가 발생합니다. 

x[2] = "world"; //Type '"world"' is not assignable to type 'undefined'.
console.log(x[5].toString()); // index.ts:28:15 - error TS2493: Tuple type '[string, number]' of length '2' has no element at index '5'.

 

Enum

js에 없는 Enum 타입을 사용할 수 있습니다. 사용법은 C에서 사용하는 방법과 비슷합니다. 

enum Color {
  Red,
  Green,
  Blue
}

let c: Color = Color.Green;

기본적으로 enum은 0부터 시작합니다. 하지만 우리는 설정을 통해서 0부터 시작하는 것을 1부터 시작하게 바꿀 수 있습니다. 

enum Color {
  Red = 1,
  Green,
  Blue
}

let c: Color = Color.Green;

 

 

혹은 수동으로 값을 설정할 수 있습니다.

enum Color {
  Red = 1,
  Green = 2,
  Blue = 4
}

let c: Color = Color.Green;

그리고 시작 점 부터 차례대로 배열과 같이 값을 참조할 수 있습니다.

enum Color {
  Red = 1,
  Green = 2,
  Blue = 4
}
let colorName: string = Color[1];

 

Any

하지만 동적인 데이터의 경우 모든 타입의 데이터를 받아서 사용할 수 있을 수도 있습니다. 그래서 Any라는 타입을 사용하여 모든 타입의 데이터를 다룰 수 있습니다. 

let notSure: any = 44;
notSure = "sure";
notSure = false;

 

이러한 역할을 보면 다른언어의 Object와 비슷하다고 생각할 수 있습니다. 하지만 typescript에서 Object의 경우 함수를 불러 올 수 없습니다. 

let notSure: any = 44;
notSure = "sure";
notSure = false;

let prettySure: Object = 4;
prettySure.toFixed(); // Error Property 'toFixed' does not exist on type 'Object'.

 

그리고 any 배열을 사용하여 다양한 타입의 값을 넣을 수 있습니다. 

let anyValue: any[] = [1, "sure", false];
anyValue[1] = false;

 

Void

void는 any의 반대편이다. 모든 타입이 존재하지 않는다. 함수의 반환 타입에 주로 사용하는데 이러한 함수는 아무 값도 반환하지 않는다. 

function warnUser(): void{
	console.log("This is my warning message");
}

만약 변수의 타입이 void라면 무조건 null 또는 undefined만을 할당할 수 있어서 유용하게 사용할 수 없을 것입니다.

(null의 경우 --strictNullChecks 해당 구문이 제공되지 않으면 사용할 수 있습니다.)

let unusable: void = undefined;
unusable = null; // OK if `--strictNullChecks` is not given

 

Null and Undefined

typescript에서는 undefined와 Null을 두개의 타입으로 제공하고 있습니다. 이 두타입은 극도로 많이 사용하지는 않습니다. 

let u: undefined = undefined;
let n: null = null;

 

null과 undefined는 모든 타입의 subtype입니다. 따라서 null과 undefined를 제외한 다른 모든 타입의 변수에 할당해줄 수 있습니다. 

 

하지만 --strictNullChecks를 사용해준다면 오로지 any에만 할당해줄 수 있습니다. (예외로 undfined는 void에 할당해줄 수 있습니다.)

또한 타입을 사용할 때 string, null, undefined 타입의 값을 통과시키고 싶다면 아래와 같이 표현할 수 있습니다. 

string | null | undefined

 

Never

never는 일반 함수나 애로우 함수는 항상 예외를 던지거나 절대 반환하지 않는 반환식입니다. 

그리고 모든 타입의 서브 타입입니다. 그러나 어떤 타입도 never의 서브 타입이 될 수 없습니다. any또한 안됩니다.

//Never
//never를 리턴할때 반드시 도달하지 않는 end point를 갖고 있어야합니다.
function error(message: string): never {
  throw new Error(message);
}

// never type으로 추론됩니다.
function fail() {
  return error("something failed");
}

// never를 리턴할 때 end point가 도달하지 않는 포인트를 가져야한다.
function infiniteLoop(): never {
  while (true) {}
}

 

Object

object타입은 number, string, boolean, bigint, symbol, null, or undefined 등을 제외하여 사용할 수 있습니다. 즉 non-primitive 타입입니다.

let unusable: object = {hoony: true};

 

'typescript > typescript-grammar' 카테고리의 다른 글

6. typescript - class  (0) 2020.03.06
5. typescript - interfaces  (0) 2020.03.03
4. typescript - 변수 선언  (0) 2020.02.29
2. typescript - 개발환경 설정  (0) 2020.02.27
1. typescript - 특장점  (0) 2020.02.26