기술 블로그

타입스크립트에서 배열 요소 타입 가드: 왜 작동하지 않는가? 본문

카테고리 없음

타입스크립트에서 배열 요소 타입 가드: 왜 작동하지 않는가?

jaegwan 2024. 9. 30. 19:33
반응형

타입스크립트에서 배열 요소 타입 가드: 왜 작동하지 않는가?

타입스크립트는 정적 타입 기반의 언어로, 타입을 명확히 정의하고 코드의 안정성을 높이는 데 중요한 역할을 한다. 그중에서도 타입 가드(Type Guard)는 변수가 특정 조건을 만족할 때 해당 변수의 타입을 좁히는 기능을 담당한다. 하지만 배열 요소에 타입 가드를 적용할 때는 예상치 못한 오류가 발생할 수 있다. 이번 글에서는 배열 요소에 타입 가드가 제대로 작동하지 않는 이유이를 해결하는 방법을 살펴보겠다.

타입 가드란?

타입 가드는 변수의 타입을 안전하게 좁히기 위해 사용하는 조건문이다. 대표적인 예로 typeof, instanceof, in 연산자가 있다. 이들은 특정 조건을 만족할 때 타입스크립트가 변수를 더욱 구체적인 타입으로 추론하도록 돕는다.

타입 가드 예시

function isString(value: any): value is string {
    return typeof value === "string";
}

function printLength(value: any) {
    if (isString(value)) {
        // 타입스크립트는 여기서 value가 string임을 알 수 있다.
        console.log(value.length);
    }
}

위 예시에서 isString 함수는 value가 문자열(string)인지 확인하는 타입 가드다. 이 타입 가드를 통해 조건문 안에서는 valuestring 타입으로 안전하게 좁혀져 사용될 수 있다.

배열 요소에 타입 가드를 적용할 때의 문제

배열 요소를 다룰 때는 배열의 동적 특성 때문에 타입 가드가 예상대로 작동하지 않는 경우가 발생한다. 예를 들어 배열에서 특정 요소를 인덱스로 접근할 때 타입스크립트는 해당 요소의 타입을 완전히 좁히지 못하는 경우가 있다.

문제 상황 예시

const fileEntries: FileSystemEntry[] = getFileEntries(); // 여러 FileSystemEntry 객체가 들어있는 배열
if (isFileSystemFileEntry(fileEntries[i])) {
    fileList.dcmFiles.push(fileEntries[i]);  // 오류 발생
}

여기서 isFileSystemFileEntry 타입 가드는 배열 요소가 FileSystemFileEntry인지 확인해준다. 그러나 타입스크립트는 fileEntries[i]의 타입을 FileSystemFileEntry로 확실하게 좁히지 못하고, 여전히 FileSystemEntry 타입으로 취급할 수 있다. 이로 인해 "fileEntries[i]"를 FileSystemFileEntry에 할당할 수 없다는 오류가 발생하게 된다.

타입스크립트가 배열 요소를 좁히지 못하는 이유

이 문제가 발생하는 주된 이유는 배열이 동적 데이터 구조이기 때문이다. 배열 요소는 인덱스로 접근할 수 있으며, 이때 배열의 길이가 동적으로 변할 수 있다고 타입스크립트는 가정한다. 즉, 배열에서 특정 인덱스를 통해 접근하는 요소가 언제든 바뀔 수 있기 때문에, 타입스크립트는 타입을 안전하게 좁히는 데 주저하게 된다.

해결 방법: 배열 요소를 변수에 할당하기

이 문제를 해결하기 위한 가장 간단한 방법은 배열 요소를 변수에 할당한 후 타입 가드를 적용하는 것이다. 이를 통해 타입스크립트는 해당 변수를 정적으로 처리할 수 있게 되며, 타입을 안전하게 좁히게 된다.

해결된 코드 예시

const fileEntry = fileEntries[i]; // 배열 요소를 먼저 변수에 할당
if (isFileSystemFileEntry(fileEntry)) {
    fileList.dcmFiles.push(fileEntry);  // 문제 해결
}

이렇게 배열 요소를 변수에 할당하면, 타입스크립트는 fileEntryFileSystemFileEntry로 좁히는 것을 확실하게 할 수 있다. 이로 인해 더 이상 타입 관련 오류가 발생하지 않으며, 타입스크립트는 안전하게 해당 요소를 fileList.dcmFiles에 추가할 수 있다.

결론

타입스크립트에서 배열 요소를 다룰 때 타입 가드가 예상대로 작동하지 않는 이유는 배열의 동적 특성 때문이다. 배열의 요소는 언제든 바뀔 수 있는 가능성이 있기 때문에, 타입스크립트는 타입을 안전하게 좁히는 것을 주저할 수 있다. 이러한 문제를 해결하려면 배열 요소를 변수에 먼저 할당한 후 타입 가드를 적용하는 방법이 효과적이다.

이 방식을 적용하면 배열 요소에 타입 가드를 성공적으로 사용할 수 있으며, 코드의 안정성과 가독성을 동시에 높일 수 있다.

반응형
Comments