함수의 매개변수가 union type
일 때(확정되지 않았을 때), Narrowing
또는 Assertion
을 통해 매개변수 타입의 경우를 나누어 주어야 한다.
Narrowing
보통 typeof
를 통해 매개변수의 타입을 검사한다.
function Cleaner(arr: (string | number)[]) {
let result: number[] = [];
arr.forEach((e) => {
if (typeof e === 'string') {
result.push(Number(e));
} else result.push(e);
});
return result;
}
console.log(Cleaner([123, '3', '6']));
let teacherA = { subject: 'math' };
let teacherB = { subject: ['science', 'english'] };
let teacherC = { subject: ['science', 'art', 'korean'] };
function SubjectColletor(teacher: { subject: string | string[] }) {
if (typeof teacher.subject === 'string') {
return teacher.subject;
} else if (Array.isArray(teacher.subject)) {
return teacher.subject[teacher.subject.length - 1];
} else return 'NO';
}
console.log(SubjectColletor({ subject: ['science', 'art', 'korean'] }));
Assertion
function AssertionEx(x :number | string){
return (x as number) + 1
}
console.log(AssertionEx(123));
as
를 사용하여 변수의 타입을 덮어씌워준다고 생각하면 된다. Narrowing
보다 간편하다고 남용하면 안된다.
어떤 타입이 들어올 지 100% 확신할 수 있을 때 사용하고,
주로 에러해결용으로 사용한다.