Typescript 타입 제한자

* Josh Goldberg의 Running TypeScript라는 책을 읽고 정리하면서 작성한 코드입니다.

1. 탑 가이

최상위 유형은 시스템에서 가능한 모든 유형을 나타내는 유형입니다. 즉, 모든 유형을 최상위 유형에 할당할 수 있습니다.

1.1 모든 종류

임의 유형은 모든 유형 위치에서 제공될 수 있는 최상위 유형처럼 작동할 수 있습니다.

유형을 지정한다는 것은 TypeScript의 유형 검사가 사용되지 않음을 의미합니다.

이 경우 TypeScript를 사용하는 것은 의미가 없으므로 any 유형을 사용하지 않는 것이 좋습니다.

모든 값이 될 수 있음을 나타내려면 unknown 형식이 훨씬 더 안전합니다.

1.2 알려지지 않은 유형

TypeScript의 진정한 최상위 유형은 unknown 유형입니다.

any 유형과 마찬가지로 모든 값을 할당할 수 있습니다. 그러나 알 수 없는 유형으로 선언된 식별자의 속성은 직접 액세스할 수 없습니다.

알 수 없는 유형에 액세스하려면 유형을 제한해야 합니다(유형 제한).


알 수 없는 유형은 최상위가 아닌 유형에 매핑할 수 없습니다.

위의 두 가지 제한 사항으로 인해 알 수 없는 형식이 임의 형식보다 더 안전합니다.

2. 술어 입력

typeof 및 instanceof와 같은 구문을 유형 제한에 사용할 수 없는 경우가 있습니다.

다음과 같은 경우에는 if 문의 type이 number나 string인 경우만 남는다고 생각합니다. 하지만 TypeScript는 isNumberOrString 함수의 반환 값이 부울임을 알고 있지만 이 기능은 유형 제약 조건에 사용되는 것으로 알려져 있지 않습니다.



따라서 인수가 특정 유형인지 여부를 나타내는 부울 값을 반환하는 함수는 is 유형 술어를 사용하여 유형 제약 함수라고 합니다. 명시적으로 선언할 수 있습니다.


형식 술어는 인터페이스의 인스턴스로 알려진 개체가 보다 구체적인 인터페이스의 인스턴스인지 확인하는 데 자주 사용됩니다.

유형 술어는 유형을 거짓 조건으로 제한하기 때문에 유형 술어가 입력 유형보다 더 많이 검사하는 경우 예기치 않은 결과를 얻을 수 있습니다. 다음 예제의 경우 else 문에서 undefined를 유추하지 않고 절대로 유형을 유추하지 않습니다.



단순 유형 술어만 사용하는 것이 좋습니다.

3. 연산자 입력

3.1의 ​​핵심

객체의 키는 String 유형이지만 String 유형으로 액세스하면 오류가 발생합니다.

keyof 연산자는 유형을 특정 객체의 키 값으로 제한하려는 경우에 사용됩니다.


3.2 종류

typeof 연산자는 제공된 값의 유형을 반환합니다.

이는 JavaScript의 typeof 연산자와 다릅니다. JavaScript typeof 연산자는 유형을 나타내는 문자열 값을 반환합니다.

TypeScript의 typeof 연산자는 제공된 값의 유형을 반환하고 컴파일 프로세스 중에 사라집니다.

typeof 키 연산자는 연속적으로 사용할 수 있습니다.

4. 어설션 입력

유형 주장을 통해 TypeScript는 유형을 재정의할 수 있습니다.

as 키워드로 유형을 지정하면 TypeScript는 식별자를 유형 어설션에 지정된 유형으로 인식합니다.


반드시 필요한 경우에만 유형 어설션을 사용하는 것이 좋습니다.

4.1 포착된 오류 유형에 대한 주장

try-catch 문에서 오류가 발생하면 어떤 유형의 오류인지 모를 수 있습니다. 오류가 Error 개체의 인스턴스라고 확신하는 경우 형식 어설션을 사용하여 처리할 수 있습니다.


Error 객체의 인스턴스인지 확신할 수 없다면 instanceof를 사용하는 것이 더 안전합니다.


4.2 Null이 아닌 클레임

형식 어설션을 사용하여 이론적으로 null 또는 undefined를 포함할 수 있는 변수에서 null 및 undefined를 제거합니다.

! 변수에 추가할 때 형식 검사는 변수의 형식이 null이 아니거나 정의되지 않은 것으로 결론을 내립니다.


Map.get()은 값이 없으면 undefined를 반환합니다. 이 경우 null이 아닌 어설션이 유용할 수 있습니다.


4.3 형식 보증에 관한 유보

형식 어설션은 꼭 필요할 때만 아껴서 사용하세요.

위의 예에서 맵 객체에 존재하지 않는 키 값에 접근하면 오류가 발생하지 않지만 런타임에 오류가 발생합니다.


주장 대 설명

변수가 선언되고 유형 주석을 통해 초기 값이 제공되면 유형 검사기는 변수의 값이 유형과 일치하는지 확인합니다.

그러나 타입 어설션으로 변수를 선언하고 초기 값을 할당하는 것은 타입 검사의 일부를 건너뛰도록 지시합니다.


따라서 변수를 선언하고 초기 값을 할당할 때 유형 주석을 사용하거나 TypeScript가 이를 유추하도록 해야 합니다.

귀속 주장

유형 어설션을 두 번 사용하면 완전히 독립적인 유형으로 전환할 수 있습니다.


유형 검사를 우회하는 데 사용할 수 있지만 코드에 문제가 발생할 수 있으므로 사용하지 않는 것이 좋습니다.

5. const 주장

const 주장은 배열, 기본 유형, 값 및 별칭을 포함한 모든 값이 상수로 취급되어야 함을 나타내는 데 사용됩니다.

const로 표시된 모든 유형에 대해 다음 세 가지 규칙이 적용됩니다.

⓵ 배열은 튜플로 취급됩니다(6장 참조).

⓶ 리터럴은 일반 프리미티브 타입이 아닌 리터럴 타입으로 취급합니다.

⓷ 객체 속성은 읽기 전용으로 간주됩니다.

5.1 리터럴에서 기본 유형으로

기본 유형에 as const 키워드를 추가하면 특정 리터럴 유형으로 지정됩니다.

특정 값 필드에 보다 구체적인 리터럴 값을 지정하는 것도 유용합니다. 라이브러리는 이 방법을 사용합니다.


5.2 읽기 전용 개체

개체에 as const 어설션을 추가하면 파생된 형식이 최대한 구체적으로 만들어집니다. 개체의 모든 구성원은 읽기 전용 속성으로 캐스팅되고 const 어설션은 개체 내의 구성원에 재귀적으로 적용됩니다.


참조

– Josh Goldberg, Running Typescript, 고승원 번역, 2023

https://www.typescriptlang.org/en/docs/handbook/intro.html