백준은 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스럽게 받은 다음에