* 조시 골드버그의 러닝 타입스크립트라는 책을 읽고 정리하면서 코드를 작성해본 내용입니다.
1. top 타입
top 타입은 시스템에서 가능한 모든 타입을 나타내는 타입이다. 즉, 모든 타입은 top타입에 할당할 수 있다.
1.1 any 타입
any타입은 모든 타입 위치에서 제공될 수 있는 top타입처럼 작동할 수 있다.
any타입을 지정한다는 것은 타입스크립트의 타입검사기를 사용하지 않겠다는 것이다.
이러면 타입스크립트를 사용하는 의미가 없기 때문에 any타입은 사용하지 않는것을 권장한다.
어떤 값이든 될 수 있음을 나타내려면 unknown 타입이 훨씬 안전하다.
1.2 unknown 타입
타입스크립트에서의 진정한 top 타입은 unknown 타입이다.
any타입과 마찬가지로 모든 값을 할당할 수 있다. 하지만, unknown타입으로 선언된 식별자의 프로퍼티에는 바로 접근할 수 없다.
unknown 타입에 접근하기 위해서는 타입을 좁혀줘야한다.(type narrowing)
unknown 타입은 top타입이 아닌 타입에는 할당할 수 없다.
위의 두 가지 제한사항 때문에 unknown 타입이 any 타입보다 더 안전하다.
2. 타입 서술어
Type narrowing을 위해 typeof, instanceof 같은 구문을 사용하지 못하는 경우가 있다.
아래의 경우 우리는 if문에서 type이 number나 string인 경우만 남을것이라고 생각 한다. 그러나 타입스크립트는 isNumberOrString 함수의 반환값 boolean 타입인것은 알지만, 이 함수가 type narrowing을 위한 함수라는 것은 알지 못한다.
이렇게 인수가 특정 타입인지를 나타내기 위해 boolean값을 반환하는 함수에 타입 서술어 is를 사용하여 type narrowing을 위한 함수라고 명시적으로 선언할 수 있다.
타입 서술어는 한 인터페이스의 인스턴스로 알려진 객체가 더 구체적인 인터페이스의 인스턴스인지 확인할 때 자주 사용한다.
타입 서술어는 false 조건으로 타입을 좁히기 때문에 타입 서술어가 입력된 타입 이상을 검사하는 경우 예상치 못한 결과를 얻을 수 있다. 아래 예시의 경우 else 구문에서 undefined를 유추하지 않고 never타입으로 유추한다.
타입 서술어는 간단하게만 사용하는 것을 권장한다.
3. 타입 연산자
3.1 keyof
객체의 키는 string타입이지만, string타입으로 접근하게 되면 에러가 발생한다.
특정 객체의 키값으로 타입을 제한하고싶을 때 keyof연산자를 사용한다.
3.2 typeof
typeof 연산자를 사용하면 제공되는 값의 타입을 반환한다.
자바스크립트의 typeof 연산자와는 다르다. 자바스크립트의 typeof 연산자는 타입을 나타내는 string값을 반환하지만,
타입스크립트의 typeof 연산자는 제공되는 값의 타입을 반환하고, 컴파일 과정에서 사라진다.
keyof typeof 연산자를 이어서 사용할 수 있다.
4. 타입 어서션(type assertion)
타입 어서션을 사용하면 타입스크립트에게 타입을 재정의 해줄 수 있다.
as 키워드를 사용하여 타입을 지정해주면 타입스크립트는 해당 식별자를 타입어서션으로 지정해준 타입으로 이해한다.
타입 어서션은 꼭 필요한 경우가 아니면 사용하지 않을 것을 권장한다.
4.1 포착된 오류 타입 어서션
try catch문에서 에러가 발생했을 때 에러가 어떤타입인지 모르는 경우가 있다. 만약 에러가 Error 객체의 인스턴스임이 확실하다면 타입 어서션을 사용하여 오류를 처리할 수 있다.
Error 객체의 인스턴스임이 확실하지 않다면 instanceof 를 사용하는것이 더 안전하다.
4.2 non-null 어서션
이론적으로 null 또는 undefined를 포함할 수 있는 변수에서 null과 undefined를 제거할 때 타입 어서션을 사용한다.
! 를 변수뒤에 붙여주면 타입 검사기는 해당 변수의 타입이 null이나 undefined는 아니라고 유추한다.
Map.get()은 값이 없는 경우 undefined를 반환하게 되는데 이 경우 non-null 어서션을 유용하게 사용할 수 있다.
4.3 타입 어서션 주의 사항
타입 어서션은 자주 사용하지말고 꼭 필요한 상황에서만 사용한다.
위의 예시에서 Map 객체에 없는 키값으로 접근하면 오류는 발생하지 않지만 런타임에서 오류가 발생한다.
어서션 vs 선언
타입 애너테이션을 통해 변수선언,초기값 할당을 하면 타입 검사기는 변수의 값이 타입과 일치하는지 검사한다.
그러나 타입 어서션으로 변수선언, 초기값 할당을 하면 타입 검사중 일부를 건너뛰도록 지시한다.
따라서 변수 선언과 초기값 할당을 할때는 타입 애너테이션을 사용하거나 타입스크립트가 유추하도록 해야한다.
어서션 할당 가능성
타입 어서션을 이중으로 사용하면 전혀 관련 없는 타입으로 전환할 수 있다.
타입검사기를 피해갈 용도로 사용할 수 있지만, 코드에 문제가 발생할 수 있기 때문에 사용하지 않는것이 좋다.
5. const 어서션
const 어서션은 배열, 원시 타입, 값, 별칭 등 모든 값을 상수로 취급해야 함을 나타낼 때 사용한다.
as const 가 붙는 모든 타입에 다음 세가지 규칙을 적용한다.
⓵ 배열은 튜플로 취급된다.(6장 참고)
⓶ 리터럴은 일반적인 원시타입이 아닌 리터럴 타입으로 취급된다.
⓷ 객체의 프로퍼티는 읽기 전용으로 간주된다.
5.1 리터럴에서 원시 타입으로
원시타입에 as const 키워드를 붙이면 특정 리터럴 타입으로 판단한다.
값의 특정 필드가 더 구체적인 리터럴 값을 갖도록하는것도 유용하다. 라이브러리 등에서 이러한 방식을 사용한다.
5.2 읽기 전용 객체
객체에 as const 어서션을 추가하면 유추된 타입이 가능한 한 구체적으로 전환된다. 객체의 모든 맴버들이 읽기 전용 속성으로 바뀌고, 객체 내에 맴버에 재귀적으로 const 어서션이 적용된다.
Reference
- 조시 골드버그, 러닝 타입스크립트, 고승원 옮김, 2023
- https://www.typescriptlang.org/ko/docs/handbook/intro.html
'개인공부 > Typescript 공부' 카테고리의 다른 글
Typescript 제네릭 (0) | 2023.03.16 |
---|---|
Typescript 클래스 (0) | 2023.03.09 |
Typescript 인터페이스 (0) | 2023.03.05 |
Typescript 배열 (0) | 2023.03.03 |
Typescript 함수 (0) | 2023.03.01 |
댓글