카테고리 없음
[Typescript] 고급타입 (문자형 리터럴 타입 ~ 다형성 this 타입)
jjin502
2024. 2. 15. 21:47
문자열 리터럴 타입
문자열을 하나의 타입으로 지정하여 사용하는 것.
type selectedGroup = 'BTS' | '뉴진스' | '블랙핑크' | '세븐틴' | null;
const GroupFilter = ({
selectedGroup,
setSelectedGroup,
}: {
selectedGroup: 'BTS' | '뉴진스' | '블랙핑크' | '세븐틴' | null;
setSelectedGroup: React.Dispatch<
React.SetStateAction<'BTS' | '뉴진스' | '블랙핑크' | '세븐틴' | null>
>;
}) => {
return (
<GroupFilterWrapper>
<GroupFilterBtn
$selected={selectedGroup === 'BTS'}
onClick={() => setSelectedGroup('BTS')}
>
BTS
</GroupFilterBtn>
<GroupFilterBtn
$selected={selectedGroup === '뉴진스'}
onClick={() => setSelectedGroup('뉴진스')}
>
뉴진스
</GroupFilterBtn>
<GroupFilterBtn
$selected={selectedGroup === '블랙핑크'}
onClick={() => setSelectedGroup('블랙핑크')}
>
블랙핑크
</GroupFilterBtn>
<GroupFilterBtn
$selected={selectedGroup === '세븐틴'}
onClick={() => setSelectedGroup('세븐틴')}
>
세븐틴
</GroupFilterBtn>
</GroupFilterWrapper>
);
};
숫자 리터럴 타입
숫자 그 자체를 타입으로 사용하는 것.
명시적으로 작성되는 경우는 거의 없으나 에러를 잡을 때 유용하게 쓰임.
function rollDice(): 1 | 2 | 3 | 4 | 5 | 6 {
// ...
}
열거형 멤버 타입 (Enum Member Types)
모든 멤버가 리터럴로 초기화될 때 타입을 가진다.
enum Direction {
Up = "UP",
Down = "DOWN",
Left = "LEFT",
Right = "RIGHT",
}
enum Status {
Active = 1,
Inactive = 0,
}
판별 유니언(구별된 유니언)
리터럴 멤버 속성이 있는 클래스가 있다면 그 속성으로 유니언 구성원을 구별 할 수 있다. 고급 유니언 패턴이며, 각각의 타입이 특정 속성을 사용해 구별되도록 할 수 있다.
일반 적으로 아래와 같이 정의됨
type MyType = Type1 | Type2 | Type3 | ...;
이때 Type1 , Type2 , Type3 은 다양한 형태의 객체를 나타내는 타입이다.
구별된 유니언을 정의하기 위해 공통된 속성을 가진 인터페이스를 만들고, 이를 이용해 각 타입을정의한다. 이러한 속성을 통해 타입스크립트는 해당 속성의 값에 따라 각각의 타입을 구별할 수 있다.
interface Circle {
kind: "circle";
radius: number;
}
interface Square {
kind: "square";
sideLength: number;
}
interface Triangle {
kind: "triangle";
base: number;
height: number;
}
type Shape = Circle | Square | Triangle;
Circle, Square, Triangle 각각은 다른 도형을 나타내는 인터페이스입니다. 이들은 모두 kind라는 공통된 속성을 갖고 있고,
이 속성을 통해 TypeScript는 구별된 유니온을 만들어내며, 각 도형을 Shape 이라는 타입으로 나타낼 수 있습니다.
그리고 아래와 같이 함수를 작성할 수 있습니다.
function getArea(shape: Shape): number {
switch (shape.kind) {
case "circle":
return Math.PI * shape.radius ** 2;
case "square":
return shape.sideLength ** 2;
case "triangle":
return (shape.base * shape.height) / 2;
}
}
이렇게 코드의 가독성을향상 시키고, 유지 관리를 쉽게할 수 있습니다