타입스크립트 - 타입 선언과 변경, 타입호환

타입 에일리어스(type alias)

타입 에일이어스는 타입스크립트 1.4 버전부터 지원된 특징입니다. 타입 에일리어스를 이용하면 기존 타입에 새로운 이름을 지을 수 있습니다.

[형식]
type<바인딩 식별자> = 타입;

바인딩 식별자(binding identifier)는 타입의 별칭에 해당하는 타입 에일라어스입니다.
타입에 새로운 별칭을 만드는 과정을 줄여서 에일리어싱(aliasing)이라고 합니다.

1
type myId = string;

타입 에일리어스는 단일 타입보다는 유니언 타입이나 리터럴 타입과 같은 다소 복작한 형태의 타입에 적용하면 좋습니다.

1
type myAlias = string | undefined;

타입 추론

타입스크립트에서는 값을 할당할 때 타입을 명시하지 않으면 타입 추론(type inference)을 통해 타입이 결정됩니다.
values는 Object 타입이며, 내부 요소는 타입이 다르더라고 서로간에 할당할 수 있습니다.

1
values[0] = values[1]

그런데 변수의 경우 각 변수에 처음 갑싱 할당되는 시점에 타입이 정해지므로 초기화가 이뤄진 다음에는 다른 타입의 값을 할당할 수 없습니다.

타입 캐스팅과 변환

타입 캐스팅(type casting)은 명시적으로 선언한 캐스팅 코드에 의한 타입 변경을 의미하며, JS 인터프리터에 의해 타입이 바뀌는 타입 변환(type conversion)과 구분됩니다.
타입 캐스팅의 예로, null 이나 undefined를 제외한 인수 값은 기본 래퍼 객체을 이용해 캐스팅 할 수 있습니다.

기본 래퍼 객체
1
2
3
4
string
Number
Boolean
Symbol

타입을 변경할 때 기본 래퍼 객체 외에도 +연산자를 이용할 수 있습니다.

parseInt 함수가 Number 함수와 다른 점이 있다면 parseInt는 함수 이름 처럼 파싱 기능이 있어 숫자 외에 여러 문자가 섞여 있을 때 숫자만을 골라서 숫자 타입으로 변경할 수 있다는 점입니다.

1
2
3
parseInt('50px'); // 50
parseInt('1010', 2); // 2진수를 인식해 10진수로 바꿔 10
Number('50px'); // NaN을 반환

타입 어설션

타입 어설션(type assertion)을 이용하면 타입스크립트 컴파일러가 타입 어설션 정보를 이용해 컴파일을 수행합니다. 따라서 타입 어설션은 컴파일 과정까지만 유효하고 컴파일 후에는 사라집니다.
타입 어셜션의 선언 방식은 크게 꺽쇠 괄호 방식과 as 문법이 있습니다.

1
2
let num1: number = <number>myNum;
let num2: number = myNum as number;

타입 어설션에 사용되는 꺽쇠 기호가 포함된 의 선언형태는 자바스크립트 라이브러리중 하나인 리액트에서 사용하는 JSX 문법과 유사해 충돌을 일으킵니다.
이러한 단점을 보완하기 위해 as 문법사용을 권장합니다.

타입 어설션은 컴파일러에게 전달되는 타입 정보이므로 컴파일러는 타입 어셜션을 보고 유효성을 검증합니다. 예를 들어 타입이 지정된 변수와 타입 어설션이 선언된 변수 간에 유효성에 문제가 없으면 두 변수 간에 타입 호환이 이뤄집니다.

타입 호환

프로그래밍 언어마다 타입 검사 시점이 다른데 타입 검사는 크게 다음과 같은 두가지 방식이 있습니다.

  • 동적 타입 검사(dynamic type checking)
  • 정적 타입 검사(static type checking)

자바스크립트 같은 동적 프로그래밍 언어는 런타임 시점에 동적 타입 검사를 수행하고, 타입스크립트 같은 정적 언어는 컴파일 시점에 정적 타입 검사를 수행합니다.

타입스크립트는 두 부류의 타입 시스템을 지원합니다.

  • 구조 타입 시스템(structural type system)
  • 명목 타입 시스템(nominal type system)

구조 타입 시스템은 타입의 구조와 정의만 같다면 타입 호환이 가능합니다. 이와 달리 명목 타입 시스템은 타입 호환이 되려면 명시적으로 같은 타입이어야 합니다.

타입 스크립트는 크게 네 부류의 타이핑 방식을 지원합니다.

  • 덕 타이핑(duck typing) - 런타임시 동적으로 타입의 구조가 정해지는 타입 지정 방식
  • 구조 타이핑(structural typing) - 타이브이 구조만 같으면 서로 호환 가능한 타입 지정 방식
  • 구조 서브타이핑(structural subtyping) - 구조가 부분적으로 같더라도 타입 호환을 지원합니다.
  • 명목 타이핑(nominal typing) - 타입 구조뿐 아니라 타입까지 같아야 호환 가능한 타입 지정 방식

덕 타이핑

덕 타이핑은 동적으로 타입이 결정되므로 유연하지만 타입 안정성은 떨어집니다. 만약 덕 타이핑을 할 때 타입 안정성을 강화하려면 인터페이스를 도입하면 됩니다.
덕 타이핑을 수행할 때 매개변수에 지정할 타입으로 사용하기 위한 인터페이스 타입을 선언하고 함수의 매개변수에 인터페이스 타입을 선언하면 덕 타이핑에도 타입 안정성이 생깁니다.

1
2
3
4
5
6
7
8
interface  DuckGoose {
speak();
swim();
}
function swim(obj: DuckGoose) {
obj.speak();
obj.swim();
}

구조 타이핑

타입 호환이 가능하며 컴파일을 통과시키고 타입 호환이 불가능 하면 컴파일 오휴를 출력합니다.
구조가 같은 클래스 간에는 서로 타입 호환이 가능해서 서로의 타입으로 구조 타이핑이 가능합니다.
생성자의 매개변수가 달라로 타입 호환이 되는 데는 문제가 없습니다. 생성자 매개변수는 접근 제한자가 설정되지 않아 생성자 내부에서만 사용할 수 있으므로 클래스 구조에 영향을 미치지 않기 때문입니다.

구조 서브 타이핑

구조 타이핑은 타입 구조가 같아야지만 타입 호환이 이뤄지지만, 구조 서브 타이핑은 구조가 부분적으로 같더라도 타입 호환을 지원합니다.

구조 서브 타이핑의 조건

구조 서브 타이핑은 하위 타입이 상위 타입으로만 호환되는 조건이 있습니다. 상위 타입은 타이핑 관점에서 공통되는 구조(변수 메서드 등)가 들어있는 기본 형태이고, 하위 타입은 상위 타입을 포함하면서 구조가 보태어진 특정한 형태를 의미 합니다.

하위 타입은 상위 타입의 속성을 포함합니다. 이때 “상위 타입 = 하위 타입”처럼 하위 타입을 상위 타입에 대입하는 것으로 구조 서브타이핑이 가능합니다. 이때 하위 타입은 상위 타입으로 타입 호환이 가능합니다.

구조가 일부 같으면 타입이 ㅇ벗더라고 변수 간의 구조 서브 타이핑이 가능합니다.

매개변수 개수와 호출시 전달하는 인수의 개수가 다르면 오류가 발생합니다. 함수의 매개변수가 다른 경우 매개변수가 적은 사위 함수 타입이 매개변수가 많은 하위 함수 타입으로 타입 호환이 가능합니다.

객테 리터럴이 할당된 변수에 인터페이스 타입을 지정하면 해당 변수는 구조 서브 타이핑이 적용됩니다.

명목 타이핑

명목 타이핑은 자바나 C++, C#과 같은 언어에서 사용하는 타이핑방식으로 명시적으로 지정된 타입 간에만 타입이 호환됩니다.

댓글

Your browser is out-of-date!

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

×