Notice
Recent Posts
Recent Comments
Link
250x250
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- owlcarousel
- fontawesome
- react npm install
- npm start
- slickslider
- 글자들여쓰기
- npm install
- 의존성문제
- 아이콘사용법
- maxwidth
- googleicon
- 플러그인
- 웹아이콘
- 이미지반응형
- npm install 문제
- Git clone
- window 정책변경
- node설치
- package.json
- XEIcon
- git lab clone
- legacy-peer
- node 오류
- minwidth
- 단어단위로떨어지기
- 정적객체
- 동적객체
- vscode git clone
- MediaQuery
- 그누보드반응형
Archives
- Today
- Total
어쩌다 알게 된 ƪ(•̃͡•̃͡ ƪ
🔵 [React/TypeScript] 타입 좁히기, 서로소 유니온 타입 본문
728x90
타입 좁히기
// 타입 좁히기
// 조건문 등을 이용해 넓은ㅇ 타입에서 좁은 타입으로 타입을 상황에 따라 좁히는 방법
type Person = {
name: string,
age: number
};
function func(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(typeof value === 'object'){
// console.log(value.getTime());
// }
else if(value instanceof Date){
console.log(value.getTime());
}else if(value && "age" in value){
console.log(`${value.name}은 ${value.age}살 입니다.`);
}
}
서로소 유니온 타입 ** 개발자 스킬 업 될 수 있음 !! **
// 서로소 유니온 타입
// 교집합이 없는 타입들로만 만든 유니온 타입
type Admin = {
tag: "ADMIN";
name: string;
kickCount: number;
};
type Member = {
tag: "MEMBER";
name: string;
point: number;
kickCount: number;
};
type Guest = {
tag: "GUEST";
name: string;
visitCount: number;
};
type User = Admin | Member | Guest;
function login(user: User){
// 이런 식이면 겹치는 게 발생하기 때문에 하단처럼 tag를 써서 사용
// if("kickCount" in user){
// console.log(`${user.name}님 현재까지 ${user.kickCount}명 강퇴했습니다.`);
// }else if("point" in user){
// console.log(`${user.name}님 현재까지 ${user.point}포인트 모았습니다.`);
// }else{
// console.log(`${user.name}님 현재까지 ${user.visitCount}번 방문했습니다.ㄴ`);
// }
// 서로소 유니온 타입 / tag 사용
// if(user.tag === "ADMIN"){
// console.log(`${user.name}님 현재까지 ${user.kickCount}명 강퇴했습니다.`);
// }else if(user.tag === "MEMBER"){
// console.log(`${user.name}님 현재까지 ${user.point}포인트 모았습니다.`);
// }else{
// console.log(`${user.name}님 현재까지 ${user.visitCount}번 방문했습니다.ㄴ`);
// }
// 더 깔끔한 코드
switch(user.tag){
case "ADMIN": {
console.log(`${user.name}님 현재까지 ${user.kickCount}명 강퇴했습니다.`);
break;
}
case "MEMBER": {
console.log(`${user.name}님 현재까지 ${user.point}포인트 모았습니다.`);
break;
}case "GUEST": {
console.log(`${user.name}님 현재까지 ${user.visitCount}번 방문했습니다.ㄴ`);
break;
}
}
}
// 권장하지 않음
// type AsyncTask = {
// state: "LOADING" | "FAILED" | "SUCCESS";
// error?: {
// message: string;
// };
// response?: {
// data: string;
// };
// }
// 권장
type LoadingTask = {
state: "LOADING";
};
type FailedTask = {
state: "FAILED";
error: {
message: string;
}
};
type SuccessTask = {
state: "SUCCESS";
response: {
data: string;
}
};
type AsyncTask = LoadingTask | FailedTask | SuccessTask;
function processResult(task: AsyncTask){
switch(task.state){
case 'LOADING':{
console.log("로딩 중...");
break;
}
case 'FAILED':{
// console.log(`에러 발생: ${task.error!.message}`); // 권장하지 않음
console.log(`에러 발생: ${task.error.message}`);
// task // FailedTask라고 단언됨
break;
}
case 'SUCCESS':{
// console.log(`성공: ${task.response!.data}`); // 권장하지 않음
console.log(`성공: ${task.response.data}`);
break;
}
}
}
const loading: AsyncTask = {
state: "LOADING"
}
const failed: AsyncTask = {
state: "FAILED",
error: {
message: "오류발쉥"
}
}
const success: AsyncTask = {
state: "SUCCESS",
response: {
data: "데이터ㅓ어엉"
}
}
processResult(loading);728x90
'개발 > 🔵 React-TypeScript' 카테고리의 다른 글
| [React-TypeScript] .d.ts 파일 (0) | 2025.04.09 |
|---|---|
| react+typescript (0) | 2025.04.05 |
| 🔵 [React/TypeScript] 타입 추론, 타입 단언 (0) | 2025.04.04 |
| 🔵 [React/TypeScript] 대수타입 (0) | 2025.04.02 |
| 🔵 [React/TypeScript] 타입 호환성 (0) | 2025.04.02 |
Comments
