방명록
- [TypeScript] TypeScript 공부일지: 타입 좁히기 [6/7 study]2024년 06월 07일 16시 15분 33초에 업로드 된 글입니다.작성자: 동혁이
TypeScript 공부일지: 타입 좁히기
❗️주의
지극히 개인 공부한 내용을 올린 거기 때문에 이해하지 못할 수도 있음
❗️타입 좁히기
조건문 등을 이용해 넓은타입에서 좁은타입으로
타입을 상황에 따라 좁히는 방법을 이야기
/** * 타입 좁히기 * 조건문 등을 이용해 넓은타입에서 좁은타입으로 * 타입을 상황에 따라 좁히는 방법을 이야기 */ // value => number : toFixed // value => string : toUpperCase function func(value: number | string) { // 마치 아래의 조건문이 number타입 값 이외에는 중괄호 내부로 들어갈 수 없도록 가드한다고해서 // TS에서는 타입 가드(Type Guard)라고 부름 if (typeof value === "number") { console.log(value.toFixed()); } else if (typeof value === "string") { console.log(value.toUpperCase()); } } /** * typeof 이외에도 여러가지 타입 가드가 있음 */ type Person = { name: string; age: number; }; // Date 같은 nodejs가 제공하는 기본적인 내장함수들은 타입으로 다 제공됨 // value => number : toFixed // value => string : toUpperCase // value => Date : getTime // value => Person : name은 age살 입니다. function func2(value: number | string | Date | null | Person) { if (typeof value === "number") { console.log(value.toFixed()); } else if (typeof value === "string") { console.log(value.toUpperCase()); } else if (value instanceof Date) { // typeof value === "object" 이렇게 사용하면 좋지않음 // value: number | string | Date | null까지 들어오면 바로 오류나옴 // 자바스크립트의 typeof에다가 null 값을 넣어도 똑같이 object 반환하기 때문임 // 이럴때 instanceof 를 사용하면됨 // instanceof 연산자는 왼쪽의 값이 오른쪽의 instance냐고 물어보는거임 // 그렇다면 true 아니면 falese를 반환함 // 쉽게말하면 instanceof 연산자는 왼쪽의 값이 Date객체냐고 물어보는거임( 자바스크립트 객체 지향에서 나온다고 함) console.log(value.getTime()); } else if (value && "age" in value) { // 방금 배운대로 value instanceof Person 사용하면 오류나옴 // 오류 : 'Person'은(는) 형식만 참조하지만, 여기서는 값으로 사용되고 있습니다. // 형식만 참조한다는 곳은 Person은 타입이라는 뜻임 // 발생하는 이유 : instanceof 연산자는 우측에 타입이 들어오면 안됨 // 엄밀히 말하면 instanceof는 왼쪽에 오는 값이 오른쪽에 오는 이 class의 instance인지 확인하는 연산자임 // Date는 자바스크립트의 내장 class이기 때문에 사용가능 // 이렇때는 in 연산자 사용 하면 됨 // 앞에는 property 이름 작성 뒤에는 안에있는 값인지 물어보면 됨 // "age" in value 존재하면 true 아니면 false 반환 // "age" in value 하지만 오류 나옴 in 연산자 뒤에는 null, undefined 들어오면 안됨 // value && "age" in value 로 사용하면 됨 console.log(`${value.name}은 &{value.age}살 입니다.`); } }
다음글이 없습니다.이전글이 없습니다.댓글