기술 블로그
타입스크립트에서 배열 요소 타입 가드: 왜 작동하지 않는가? 본문
타입스크립트에서 배열 요소 타입 가드: 왜 작동하지 않는가?
타입스크립트는 정적 타입 기반의 언어로, 타입을 명확히 정의하고 코드의 안정성을 높이는 데 중요한 역할을 한다. 그중에서도 타입 가드(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
)인지 확인하는 타입 가드다. 이 타입 가드를 통해 조건문 안에서는 value
가 string
타입으로 안전하게 좁혀져 사용될 수 있다.
배열 요소에 타입 가드를 적용할 때의 문제
배열 요소를 다룰 때는 배열의 동적 특성 때문에 타입 가드가 예상대로 작동하지 않는 경우가 발생한다. 예를 들어 배열에서 특정 요소를 인덱스로 접근할 때 타입스크립트는 해당 요소의 타입을 완전히 좁히지 못하는 경우가 있다.
문제 상황 예시
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); // 문제 해결
}
이렇게 배열 요소를 변수에 할당하면, 타입스크립트는 fileEntry
를 FileSystemFileEntry
로 좁히는 것을 확실하게 할 수 있다. 이로 인해 더 이상 타입 관련 오류가 발생하지 않으며, 타입스크립트는 안전하게 해당 요소를 fileList.dcmFiles
에 추가할 수 있다.
결론
타입스크립트에서 배열 요소를 다룰 때 타입 가드가 예상대로 작동하지 않는 이유는 배열의 동적 특성 때문이다. 배열의 요소는 언제든 바뀔 수 있는 가능성이 있기 때문에, 타입스크립트는 타입을 안전하게 좁히는 것을 주저할 수 있다. 이러한 문제를 해결하려면 배열 요소를 변수에 먼저 할당한 후 타입 가드를 적용하는 방법이 효과적이다.
이 방식을 적용하면 배열 요소에 타입 가드를 성공적으로 사용할 수 있으며, 코드의 안정성과 가독성을 동시에 높일 수 있다.