이번 장에서는 타입시스템에 대한 요약본을 남겨두려한다. 책을 읽고 정리한거라 참고 해주면 좋을거같다
타입스크립트의 타입 시스템
타입 에너테이션
- 변수나 상수 혹은 함수의 인자와 반환 값에 타입을 명시적으로 선언해서 어떤 값이 저장 될 것인지 컴파일러에게 알려주는 것
구조적 타이핑
- 프로그래밍언어에서 값이나 객체는 하나의 구체적인 타입을 가지고 있다는 것을 구조적 타이핑이라함
- 또 다른말로 구체화한 타입 시스템이라고도 함
구조적 서브 타이핑
타입스크립트의 타입
- Typescript는 값의 집합 이라고도 표현함
- 특장 값에 많은 집합에 포함될 수 있음
- 예를 들면, 타입스크립트에서는 특정 값이 String or number 타입을 동시에 가질수도 있음
그래서 구조적 서브 타이핑이 뭔데?
- 집합으로 나타낼 수 있는 타입스크립트의 타입시스템을 지탱하고 있는 것을 말함
- 이름이 다른 객체라도 가진 속성이 동일하면 타입스크립트는 서로 호환이 가능함
명목적 타이핑 vs 덕 타이핑 vs 구조적 타이핑
명목적 타이핑
- 타입의 구조가 아닌 타입의 이름만을 가지고 구별 하는 것
- C++, Java가 대표적
덕 타이핑
- 어떤 함수의 매개변수에 올바르게 주어지면, 그 값이 어떻게 만들어졌는지 신경쓰지 않고 사용하는 개념
- 자바스크립트가 대표적
- 동적 타입에 주로 사용
구조적 타이핑과 덕타이핑의 공통점
- 객체가 가진 속성을 기반으로 타입을 검사함
- 둘다 모두 객체 변수, 메서드 같은 필드를 기반으로 타입을 검사함
구조적 타이핑과 덕타이핑의 차이점
- 타입을 검사하는 시점에 차이가 있음
- 덕타이핑은 런타임에 검사를 하고, 구조적 타이핑은 컴파일 타임에 타입체커가 타입을 검사함
점진적 타입 확인
- 컴파일 타임에 타입을 검사하면서, 필요에 따라 타입 선언 생략을 허용하는 방식
- 타입을 지정한 변수와 표현식은 정적으로 타입으로 검사하지만, 타입선언이 생략되면 동적으로 검사를 함
- 타입을 생략하게 되면 암시적 타입 변환이 일어남
값 vs 타입
값
- 프로그램이 처리하기 위해 메모리에 저장하는 모든 데이터를 말함
- 문자열, 숫자, 변수, 매개변수, 객체, 함수가 이에 해당함
- 할당 연산자인 =으로 작성함
타입
- 타입 선언(:) or 단언 문(as)으로 작성됨
값과 타입의 공통점
- 타입스크립트에서 별도의 네임스페이스에 존재함
값과 타입 공간에 동시에 존재하는 것
- class
- enum
위의 2개가 런타임에서 동작하는 방식
class
- 값 공간에서 class는 함수 값으로 동작을 함
- 생성자 함수이기 때문에, 함수로 동작을 함
enum
- 런타임에 객체로 변환하는 값, 런타임에 실제 객체로 존재하며, 함수로도 표현이 가능함
- 클래스처럼 타입 공간에서 타입을 제한하는 역할, 타입스크립트 런타임에서 실제 값으로 쓰임
타입스크립트에서 자바스크리븥의 키워드가 해석되는 방식
키워드 값 타입
class | Y | Y |
cont, let, var | Y | N |
enum | Y | Y |
function | Y | N |
interface | N | Y |
type | N | Y |
namespace | Y | N |
타입을 확인 하는 방법
typeof
- 연산하기전에 피연산자의 데이터 타입을 나타내는 문자열을 반환함
- 연산자가 반호나하는 값은 자바스크립트의 7가지 기본 데이터 타입, 호스트 객체, object 객체가 될 수 있음
typeof 값에서 쓰일 때 vs 타입에서 쓰일 때
→ typeof 연산자는 값에서 쓰일 때와, 타입에서 쓰일 때 반환값이 다르므로 주의가 필요함
값에서 쓰일 때
- 자바스크립트 런타임의 typeof 연산자가 됨
- 값에서 사용될 때는 자바스크립트의 typeof 연산자와 동일하게 동작함
타입에서 쓰일 때
- 값을 읽고 타입스크립트의 타입을 반환함
instanceof
- 프로토타입 체이닝 어딘가에 생성자의 프로토타입 속성이 존재하는지 판단할 수 있음
타입 단언
- 타입을 강제할 수 있는 문법 이며, as 키워드를 사용하면 됨
- 개발자가 해당 값의 타입을 더 잘 파악할 수 있을 때 사용함
- 강제 형변환과 유사한 기능
이외
- 타입 가드라는 패턴도 존재함