타입 스크립트 [01]

Type Script


TypeScript - 01 -

목차



동적 타입 언어 vs 정적 타입 언어

JavaScript는 동적 타입 언어이다. 변수에는 타입이 없고 값이 할당되면 타입 추론으로 타입이 정해진다.

재할당이 가능한 경우, 재할당하면 타입 추론을 다시 하게 됨

1
2
3
4
5
var x; // 타입이 없다.
x = 1; // 숫자 타입.
var y = 'abc' // 문자열 타입.
var z = 5; // 숫자 타입.
z = 'abcd' // 문자열타입으로 변경됨.

정적인 언어에서는 위와 같이 동적으로 타입이 결정되지 않는다.

정적 타입 언어에서 타입을 정해주는 이유는 메모리에 값을 집어넣기 위해 얼마만큼의 공간이 필요한가를 알기 위함이다.

아래의 경우는 Java에서 변수를 선언할 때 예이다.

1
2
int a = 5;
String b = 'abc';
타입 Java JS
int 4바이트 x (부동소수점 8바이트로 대체)
float 4바이트 8바이트 부동소수점(정수 없음)
double 8바이트 8바이트 부동소수점(정수 없음)
char 2바이트 x (String타입이 대신 존재한다. - 2바이트)
  • 자바스크립트의 숫자타입은 정수가 없다.
  • 자바스크립트에서 문자열을 원시값이라고 배웠지만, 실제로 문자열은 원시값이 아니라 한 개 이상의 문자로 이루어진 배열이다.
  • char형은 본래 1바이트이지만 한글등 여러 나라 언어를 표기하는 문제로 인해 유니코드를 사용한다.(2바이트)
  • 이모지 2~4 바이트
  • 현대 자바스크립트는 애플리케이션 개발 언어가 되었다.
  • 자바스크립트는 암묵적 처리가 많아 대규모 작업시 오히려 이해하기가 어려워졌다.

자바스크립트의 특징

자바스크립트의 배열

배열을 getOwnPropertyDescriptor로 확인할 경우 객체임을 확인할 수있다.(유사배열)

  • 원론적인 의미의 배열과 자바스크립트의 배열은 다르다,
  • 원론적으로 요소의 타입이 통일되어 있어야 한다,(메모리 공간이 연속되어 있도록-접근이 빠르다)
  • 자바스크립트에서는 단지 프로퍼티의 value이므로 [100, ‘apple’, true]와 같이 모든 값이 올 수 있다.(엄밀히 말하면 배열이 아니다.)

타입스크립트

JS는 대규모 프로젝트에서 코드가 복잡해질 수 있고 디버그와 테스트 공수가 증가하는 등의 문제를 일으킬 수 있다.

  1. 타입스크립트 = 자바스크립트의 Superset(상위확장)

    • TypeScript 또한 자바스크립트 대체 언어의 하나로써 자바스크립트(ES5)의 Superset(상위확장)

    • ES6(ECMAScript 2015)의 클래스, 모듈 등과 ES7의 Decorator 등을 지원한다.

    • Babel과 같은 별도 트랜스파일러(Transpiler)를 사용하지 않아도 ES6의 새로운 기능을 기존의 자바스크립트 엔진(현재의 브라우저 또는 Node.js)에서 실행할 수 있다.

    • 모든 기존 코드를 호환한다.(단, 클래스는 타입스크립트 문법을 따라야 한다.)

      1
      2
      3
      4
      5
      6
      7
      // 클래스는 TS문법을 따라야한다.
      class Person {
      name: string;
      constructor(name: string) {
      this.name = name;
      }
      }
  2. 에디터와의 호환성

    • JS에 경우 값을 할당하고나서 타입 추론으로 에디터를 통해 코드 어시스트를 받지만, 정적 타입은 변수 선언부터 에디터의 코드 어시스트, 타입 체크, 리펙토링 을 받을 수 있다.
  3. 강력한 객체지향 프로그래밍 지원

    • 대규포 프로젝트에서 자주 사용되는 객체 프로그래밍을 지원받을 수 있다.
    • 인터페이스
    • 제네릭

타입스크립트 설치

  1. npm 전역 설치

    1
    $ npm install -g typescript
  2. 버전확인

    1
    $ tsc -v
  3. 타입스크립트 컴파일

    파일명.ts -> 파일명.js로 분리함.

    1
    $ tsc 파일명
  4. config 설정

    • config파일 생성 (tsconfig.json)
    1
    $ tsc --init
    • “target” : “es5” (컴파일 할 버전)
    • “module” : “commonjs”
    • config 설정 완료 후 tsc만 입력해도 컴파일이 됨. (모든 ts파일 자동 컴파일)
    • tsc 파일명 작성 시 tsconfig.json 설정 무시하고 해당 명령어 우선 실행
  5. 코드 저장 시 자동 tsc 명령 설정 ( tsconfig.json 있어야함. )

    1
    $ tsc -w

타입스크립트 타입

  1. any[] : 배열 내부에 어떤 값이 와도 된다. (number[] -> 배열 내부에 숫자타입만 허용된다.)

  2. tuple : 만드는 배열의 요소 개수를 정하고, 요소의 타입을 fix한다.

  3. enum : [키 : 값] 형태에서 키는 값의 이름으로서 중요성을 나타내지만 enum은 키의 이름 자체에 의미를 두는것.

    대표적인 예로 조이스틱의 UP, DOWN, LEFT, RIGHT 등이 있다.

  4. never: 함수에 리턴 값이 없을 때 사용. (생략 가능)

  5. 특정 객체 타입을 지정해줄 때는 앞글자를 대문자로 한다. (Date, String 등등)

    1
    2
    3
    let objectStr: String;
    objectStr = 'hello'; // OK
    objectStr = new String('hello'); // OK

TypeScript는 ES5, ES6의 Superset(상위확장)이므로 자바스크립트의 타입을 그대로 사용할 수 있다.

자바스크립트의 타입 이외에도 TypeScript 고유의 타입이 추가로 제공된다.

Type JS TS Description
boolean ◯ ◯ true와 false
null ◯ ◯ 값이 없다는 것을 명시
undefined ◯ ◯ 값을 할당하지 않은 변수의 초기값
number ◯ ◯ 숫자(정수와 실수, Infinity, NaN)
string ◯ ◯ 문자열
symbol ◯ ◯ 고유하고 수정 불가능한 데이터 타입이며 주로 객체 프로퍼티들의 식별자로 사용(ES6에서 추가)
object ◯ ◯ 객체형(참조형)
array ◯ 배열
tuple ◯ 고정된 요소수 만큼의 타입을 미리 선언후 배열을 표현
enum ◯ 열거형. 숫자값 집합에 이름을 지정한 것이다.
any ◯ 타입 추론(type inference)할 수 없거나 타입 체크가 필요없는 변수에 사용. var 키워드로 선언한 변수와 같이 어떤 타입의 값이라도 할당 가능.
void ◯ 일반적으로 함수에서 반환값이 없을 경우 사용한다.
never ◯ 결코 발생하지 않는 값

다양한 타입을 사전 선언하는 방법.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
// boolean
let isDone: boolean = false;

// null
let n: null = null;

// undefined
let u: undefined = undefined;

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

// string
let color: string = "blue";
color = 'red';
let myName: string = `Lee`; // ES6 템플릿 문자열
let greeting: string = `Hello, my name is ${ myName }.`; // ES6 템플릿 대입문

// object
const obj: object = {};

// array
let list1: any[] = [1, 'two', true];
let list2: number[] = [1, 2, 3];
let list3: Array<number> = [1, 2, 3]; // 제네릭 배열 타입

// tuple : 고정된 요소수 만큼의 타입을 미리 선언후 배열을 표현
let tuple: [string, number];
tuple = ['hello', 10]; // OK
tuple = [10, 'hello']; // Error
tuple = ['hello', 10, 'world', 100]; // Error
tuple.push(true); // Error

// enum : 열거형은 숫자값 집합에 이름을 지정한 것이다.
enum Color1 {Red, Green, Blue};
let c1: Color1 = Color1.Green;

console.log(c1); // 1

enum Color2 {Red = 1, Green, Blue};
let c2: Color2 = Color2.Green;

console.log(c2); // 2

enum Color3 {Red = 1, Green = 2, Blue = 4};
let c3: Color3 = Color3.Blue;

console.log(c3); // 4

/*
any: 타입 추론(type inference)할 수 없거나 타입 체크가 필요 없는 변수에 사용한다.
var 키워드로 선언한 변수와 같이 어떤 타입의 값이라도 할당할 수 있다.
*/
let notSure: any = 4;
notSure = 'maybe a string instead';
notSure = false; // okay, definitely a boolean

// void : 일반적으로 함수에서 반환값이 없을 경우 사용한다.
function warnUser(): void {
console.log("This is my warning message");
}

// never : 결코 발생하지 않는 값
function infiniteLoop(): never {
while (true) {}
}

function error(message: string): never {
throw new Error(message);
}

타입 추론

만약 타입 선언을 생략하면 값이 할당되는 과정에서 동적으로 타입이 결정된다.

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

위 코드를 보면 변수 foo에 타입을 선언하지 않았으나 타입 추론에 의해 변수의 타입이 결정되었다. 동적 타입 언어는 타입 추론에 의해 변수의 타입이 결정된 후에도 같은 변수에 여러 타입의 값을 교차하여 할당할 수 있다.

하지만 정적 타입 언어는 타입이 결정된 후에는 타입을 변경할 수 없다.

TypeScript는 정적 타입 언어이므로 타입 추론으로 타입이 결정된 이후, 다른 타입의 값을 할당하면 에러가 발생한다.

1
2
let foo = 123; // foo는 number 타입
foo = 'hi'; // error: Type '"hi"' is not assignable to type 'number'.

Share