타입스크립트에서 string[] | number[] 이렇게 타입을 지정하면 어떤 배열인지 알 수 없어 filter, map 등의 함수를 사용할 수 없다. 그래서 isStringValueList 함수를 만들어서 타입가드로 처리하거나 [...valueList] 를 하면 (string | number)[] 이 되면서 오류가 사라진다.

타입 가드(Type Guard) 사용: **isStringValueList**와 같은 사용자 정의 타입 가드를 사용하면 런타임에 배열이 어떤 타입인지 확인하고 컴파일러에게 이 정보를 알려줄 수 있습니다. 그래서 이후 코드에서는 해당 타입에 맞는 메서드를 안전하게 사용할 수 있습니다.

function isStringValueList(arr: any[]): arr is string[] {
    return arr.every(item => typeof item === 'string');
}

const myArray: string[] | number[] = getSomeArray();

if (isStringValueList(myArray)) {
    myArray.map(s => s.toUpperCase());  // 이제 안전하게 사용 가능
}

타입 단언(Type Assertion) 또는 타입 변경: **[...valueList]**를 사용해서 새 배열을 생성하면, 컴파일러는 이 배열이 (string | number)[] 타입을 가질 것으로 판단합니다. 그래서 filter, map 같은 메서드를 사용할 수 있지만, 그 메서드 내에서 처리되는 각 요소가 **string**인지 **number**인지는 여전히 확인해야 할 수도 있습니다.

const newArray: (string | number)[] = [...myArray];
newArray.map(item => {
    if (typeof item === 'string') {
        return item.toUpperCase();
    }
    return item * 2;
});