
지난 시간에는 함수에 타입을 지정하는 법과 void 타입에 대해 알아보았습니다. 오늘은 타입을 확정하는 Narrowing 과 Assertion 에 대해 알아보겠습니다.
const plus = (x: string | number) => {
if (typeof x === "string") {
return x + "1";
} else {
return x + 1;
}
};혹은 assertion 문법으로 타입을 덮어쓰면 됩니다. '나는 이 변수를 number 라고 주장하겠습니다.' 라는 뜻으로 이해하면 되며, 아래 코드에서는 array의 0번째 인덱스에 x를 대입하려고 하면 오류가 발생하지만, assertion 문법을 사용하면 해결이 됩니다.
const plus = (x: string | number) => {
let array: number[] = [];
array[0] = x; // 에러 발생
};
const plus = (x: string | number) => {
let array: number[] = [];
array[0] = x as number;
};
let nickname: string = "kim";
nickname as number; // 에러 발생assertion 은 무슨 타입이 들어올지 100% 확실할 때만 쓰는 것입니다. 사실은 그냥 타입실드를 임시로 해제하는 것이기 때문에 if문을 사용하는 것이 나은데, 왜냐하면 assertion 은 타입이 맞지 않아도 에러를 캐치하지 못하기 때문입니다. 그래서 남이 짠 코드를 수정하거나 왜 타입에러가 나는지 모르겠는 비상용으로만 알고 있으면 됩니다.
const plus = (x: string | number) => {
let array: number[] = [];
array[0] = x as number;
};
plus("123"); // 에러 발생 x
let nickname: string = "kim";
<number>nickname; // 에러 발생연습으로, 숫자 여러개를 array 자료에 저장해놨는데 가끔 ‘4’, ‘5’ 이런 식으로 문자타입의 숫자가 발견되어 이를 클리닝해주는 함수가 필요하다고 칩시다. cleaning([’1’, 2, ‘3’]) 이렇게 숫자와 문자가 섞인 array를 입력하면 [1, 2, 3] 이렇게 숫자로 깔끔하게 변환되어 나오는 클리닝함수를 만들어봅시다.
const cleaning = (x: (number | string)[]): number[] => {
return x.map(Number);
};
console.log(cleaning(["1", 2, "3"])); // [1, 2, 3]
다음과 같은 함수도 만들어봅시다. 여러 변수에 선생님이 가르치고 있는 과목이 저장되어 있습니다. ‘chulsu’ 같은 object 자료를 파라미터로 집어넣으면 그 선생님이 가르치고 있는 과목중 맨 뒤의 1개를 return 해주는 함수를 만들어봅시다.
let chulsu = { subject: "math" };
let jisu = { subject: ["science", "english"] };
let minsu = { subject: ["science", "art", "korean"] };
const title = (x: { subject: string | string[] }) => {
if (typeof x.subject === "string") {
return x.subject;
} else if (Array.isArray(x.subject)) {
return x.subject[x.subject.length - 1];
}
};
console.log(title({ subject: ["englist", "art"] })); // art
지금까지 Narrowing 과 Assertion 에 대해 알아보았습니다. 다음 시간에는 타입도 변수에 담아 쓰는 방법을 알아보겠습니다.