형변환

가끔 타입스크립트가 알 수 없는 값의 유형에 대한 정보를 얻을 수 있습니다.예를 들자면 사용자가 id 를 이용해 html파일에서 input 요소를 사용하고자 하자면, 타입스크립트는 그 요소가 일종의 HTMLElement 라는 것을 알고 있을지 모릅니다. 하지만, 사용자는 이 페이지에는 언제나 특정 아이디를 가지고 있는 HTMLInputElement 를 가지고 있을 것을 알고 있을 것 입니다. 이래서 이러한 상황에서는 조금더 특정한 타입을 지정해주기위해 타입 형변환을 이용해 줄 수 있습니다

const input2 = document.getElementById("userInput");
input2.value = "hi";

위의 경우에는 input2null 일수도 있고 HTMLElement 일수도 있으므로 에러가 발생할 것입니다. 그래서 아래와 같이 null 이 아닐 경우와 그리고, 요소가HTMLInputElement 임을 형변환 해주어야합니다

const input = <HTMLInputElement>document.getElementById("userInput")!;
input.value = "hi there";

그래고 위의 코드는 아래와 같이도 작성해 줄 수 있습니다

const input2 = document.getElementById("userInput") as HTMLInputElement;

그런데 아래와 같이 이미 구체적으로 타입이 명시 되어있는 경우에는 타입 형변환이 불가능합니다

const x = "hello" as number;

위의 경우에는 문자열을 숫자로 변환하는 것이기 때문에 만약 이를 의도적으로 하는 경우에는 hello를 한번 unkown 타입으로 형변환 후에 다시 형변환 해주어야합니다.

인덱스 속성 (Index Signatures)

인덱스 타입은 타입을 동적으로 이용할때 사용하는 방법 중 하나로 코드를 유연하게 작서을 하는데 도움을 줍니다.

예를 들어 사용자가 입력하는 값에 따라 유효성을 검사하고 그에 따른 에러를 뱉어주는 객체를 만들고자할때 아마 아래와같은 인터페이스를 만들어 주어야 할 것 입니다

interface ErrorContainer {

}

그런데 이러한 에러 식별자는 여러 속성을 지녀야하는데 ,정확히 어떤 속성이 어떻게 들어가야할지 명확하지 않을 때가 존재하기도하고, 이를 재사용하고 싶을때도 분명 존재할 것입니다. 즉 미리 타입의 속성과 속성명은 알고 있으나 값의 타입을 알고 있는 경우에 이 인인덱스 속성을 이용하기에 용이합니다.

인덱스 속성의 모양은 아래와 같습니다

interface ErrorContainer {
  [prop: string]: string;
}

여기서는 prop 이라 작성해주었지만 key 라는 이름 역시 가능합니다, 그리고 그 불리언을 제외한 타입을 지정해 줄 수 있는데, 이를 통해 이 ErrorContainer 를 사용하는 객체는 반드시 문자열의 속성을 지닌다는 것을 지정해 줄 수 있습니다.그리고 값 역시 문자열임에 명확하다면 위와같이 지정해 줄 수 있습니다.

이를 통해 우리는 속성의 이름과 속성의 개수는 모르지만 결국 ErrorContainer 에 추가되는 모든 속성은 문자열이여야한다는 것을 지정해줄 수 있습니다. 그래서 이를 통해 사전 정의된 속성을 추가해 줄 수 있습니다.

만약 id가 숫자라면 이미 인덱스 타입은 문자열이므로 에러가 발생하게 됩니다