[TypeScript] Narrowing & Assertion

김병화·2023년 4월 11일
0

함수의 매개변수가 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% 확신할 수 있을 때 사용하고,
주로 에러해결용으로 사용한다.

=> Assertion보다 엄격한 Narrowing을 사용하자.

0개의 댓글