본문 바로가기

프로그래밍/TypeScript

10. 타입선언과 변경, 호환

10.타입선언과 변경, 호환

10.1.1 타입 에일리어스
단일 타입에 대해 타입 에일리어스를 선언해서 사용하는 것은 직관적이지 않습니다.

- 타입 에일리어스를 이용한 유니언 타입 선언

-------------------------------------------
type myId = string;
type myAlias = string | undefined;
type User = {
    id: myId;
    alias?: myAlias;
    city: string;  
};

let id1: User = { id: "happy1", city: "seoul" };
let id2: User = { id: "happy2", alias: undefined, city: "busan" };
let id3: User = { id: "happy3", alias: "happy3!!", city: "gumi" };

console.log(typeof id1, id1);
console.log(typeof id2, id2);
console.log(typeof id3, id3);
-------------------------------------------

- 타입 에일리어스를 이용한 배열 타입 선언
배열은 하나의 변수에 여러 값을 관리할 수 있는 효율적인 자료형입니다.
배열에 입력되는 값은 대체로 같은 타입을 갖지만, 
문자열 "true"나 불리언 true 처럼 입력할 때 구분이 모호한 경우가 있습니다.
이러한 경우 typeof를 이용해 문자인지 숫자인지를 확인해서 입력받아야만 합니다. 

예를들어 불리언 또는 숫자만 입력받는 배열이 있다고 해봅시다.

-------------------------------------------
type MyArrayType = Array;
let myArray: MyArrayType = [1, true];
console.log(myArray.toString());
console.log(typeof myArray[0], typeof myArray[1]);
-------------------------------------------

이렇게 하면 숫자나 불리언 값으로 여겨질 수 있는 문자열 "1"이나 "true"가 입력되는 것을 방지할 수 있습니다.


10.1.2 타입추론
TypeScript는 타입 추론이 가능합니다.
하지만, 변수의 타입은 처음 할당되는 시점에 정해지므로
초기화가 이뤄진 다음에는 다른 타입의 값을 할당할 수 없습니다.

let first = 1;
let second = "2";
// first = second // 오류


10.1.3 타입 캐스팅과 어설션

- 타입 캐스팅과 변환

type casting : 명시적으로 선언한 캐스팅에 의해 타입이 변경되는 것을 말한다.

type conversion : JS 인터프리터에 의해 타입이 바뀌는 타입 변환을 말한다.


let myNum: any = "2019";
let num1 = + myNum;
let num2 = Number(myNum);
let num3 = parseInt(myNum);

parseInt, Number 같은 타입 변환 함수들은 컴파일 후에도 유지됩니다. 


- 타입 어설션 type assertion
: 타입 강제화 정도로 생각하면 될듯
어설션을 사용하는 2가지 방법

let num4: number = myNum;

let num5: number = myNum as number;

myNum 변수는 원래 any 타입인데 어설션이 되어있으므로
컴파일러가 myNum을 number 타입으로 인식해 num4 변수에 할당합니다.

<> 형태는 자바스크립트 라이브러리 중에 하나인 리액트에서 사용하는 JSX 문법과 유사해
충돌을 일으키므로 as 연산자를 사용하는 것을 권장한다. 


10.2 타입 호환 type compatibility

동적 타입 검사 : javascript
정적 타입 검사 : typescript

typescript의 typeSystem

구조 타입 시스템 (structural type system)
: 타입의 구조와 정의만 같다면 타입 호환이 가능합니다.

명목 타입 시스템 (nominal type system)
: 타입 호환이 되려면 명시적으로 같은 타입이어야 합니다. 


전통적인 C++나 Java 같은 언어는 명목 타입 시스템만을 지원하지만, 
타입 스크립트는 구조 타입 시스템도 지원합니다.


타입스크립트에서 지원하는 타이핑 방식
1) 덕 타이핑 (duck typing)
: 런타임시 동적으로 타입의 구조가 정해지는 타입 지정 방식
덕 타이핑은 동적으로 타입이 결정되므로 유연하지만 타입 안정성은 떨어집니다.
덕 타입핑을 할 때 타입안전성을 강화하려면 상위 인터페이스를 도입하면 됩니다. 

2) 구조 타이핑 (structural typing)
: 클래스 간에 멤버변수가 같을 경우 타입호환이 가능합니다. 
: 상속을 통해 만들어진 클래스와 같은 구조를 가진 클래스가 있다면 타입 호환이 가능합니다.
: 구조가 같은 클래스와 인터페이스 간에 타입 호환이 가능합니다. 

3) 구조 서브타이핑 (structural subtyping)
: 구조가 부분적으로 같더라도 타입 호환을 지원합니다.
하위 타입이 상위 타입의 속성을 포함할 때, 하위 타입을 상위 타입에 대입하는 것으로
구조 서브타이핑이 가능합니다. 

4) 명목 타이핑 (nominal typing)

Java, C++, C# 과 같은 전통적인 언어에서 사용하는 타이핑 방식으로
명시적으로 지정된 타입 간에만 타입이 호환가능 한 것입니다.

'프로그래밍 > TypeScript' 카테고리의 다른 글

11. 제네릭  (0) 2019.10.23
09. 고급 타입  (0) 2019.10.16
08.모듈  (0) 2019.10.16
07.클래스와 인터페이스 기반의 다형성  (0) 2019.10.15
07. 클래스와 인터페이스  (0) 2019.10.15