백준은 TS컴파일러를 지원하지 않기에 TS로 작성하고 JS로 컴파일한 코드로 풀어보면 되겠지?
라는 생각으로 TS로 코드를 작성하는데,
나는 readline템플릿을 사용하고 있어서 백준에서 주어진 입력값을 빼오려면 shift()를 사용해야했다
근데 이 shift() 하는데만 정말 많은 에러를 쏟아냈고 해결하면서 역시 TS는 타입만 추가된 단순한 언어가 아닌 정말 정교한 언어라는 것을 다시 한번 깨달았다
배열을 사용할때 shfit()메소드를 사용할 때가 있습니다
여기서 반드시 수행해야 할 과정이 있습니다
배열에서 shift()를 해올때 무조건 값이 리턴된다는 보장이 없습니다. 만약 배열이 비어있다면 undefined가 리턴됩니다
그러므로 리턴값을 받는 변수 또한 union type으로 undefined도 선언해 줘야 합니다
shift()한 리턴값을 다른 타입으로 받는 것이라면
shfit()한 리턴값에 대해서 반드시 타입을 즉시 캐스팅 해줘야 합니다.
let data: number[] = [1,2,3,4];
let N: number | undefined = data.shift();
// let N = data.shift();
// 이렇게 해도 에러는 안 뜨긴 하지만, 이 방식은 TS가 아니라 JS입니다
let data: string[] = ['5', '54321'];
let N: number | undefined = Number(data.shift());
이 경우는 좀 특이합니다
let data2: string[] = ['54321'];
let numbers: number[] = String(data2.shift()).split('').map(Number);
그리고 또 하나의 방법이 있습니다
const data: string[] = ['54321'];
const tmp = (data: string[]): number[] | undefined => {
const str = data.shift();
if (!str) { //undefined라면 그냥 리턴
return;
}
const numbers: number[] = str.split('').map(Number);
return numbers;
};
let result = tmp(data);
if (result) {
console.log(result); // [ 5, 4, 3, 2, 1 ]
} else {
console.log(undefined);
}
['54321'] 을 숫자 배열로 리턴하는 과정에서 함수를 사용한 것입니다
str의 타입을 string | undefined로 하지 않고 우선 JS스럽게 받은 다음에