

.ts 파일로 엄격한 타입 검사를 받으며 코딩한다..js를 실행한다.즉, TypeScript는 JavaScript의 자유분방함에 엄격한 규율과 안정성을 도입하여, 대규모 프론트엔드 프로젝트를 견고하게 만드는 도구
Uncaught TypeError 같은 악몽을 획기적으로 줄여준다..)만 찍으면 알 수 있게 해준다.TypeScript의 본질은 변수와 함수의 모양(Shpae)을 미리 정의하는 것이다.
변수나 함수 파라미터 뒤어 :타입을 붙여 의도를 명확히 한다.
// Java: String name = "Lee";
let name: string = "Lee";
let age: number = 30; // int, float 구분 없이 number
// 함수 파라미터와 반환값 타입 지정
functino add(a: number, b: number): number {
return a + b;
}
ava의 Class나 DTO와 유사하며, 객체의 구조를 강제하는 데 핵심적으로 사용된다.
interface UserDto {
id: number;
username: string;
email?: string; // ?는 선택적(Optional) 필드 (null/undefined 가능)
}
const user: UserDto = {
id: 1,
username: "DevKim",
// email은 없어도 에러 안 남
};
재사용 가능한 컴포넌트나 함수를 만들 때 타입을 유연하게 처리한다.
// T타입의 배열을 받아 T를 반환하는 함수
function getFirstElement<T>(arr: T[]): T {
return arr[0];
}
const num = getFirstElement<number>([1,2,3]); // num은 number 타입
부모 컴포넌트가 자식에게 데이터를 넘겨줄 때, "이 자식은 어떤 데이터를 받아야 하는지" 규격을 정한다. 가장 많이 사용되는 영역.
label 누락), 잘못된 타입(onClick에 문자열 전달)을 넣으면 에러가 발생// 1. 받는 데이터의 모양(Interface)을 정의
interface ButtonProps {
label: string;
onClick: () => void; // 리턴값이 없는 함수 타입
isActive?: boolean;
}
// 2. 컴포넌트에 적용 (제네릭이나 매개변수 타입으로)
const MyButton = ({ label, onClick, isActive }: ButtonProps) => {
return (
<button className = {isActive ? 'blue' : 'bray'} onClick={onClick}>
{label}
</button>
);
};
백엔드 서버와 주고받는 JSON 데이터의 '그릇'을 정의한다.
// 서버에서 오는 JSON 구조 그대로 정의
export interface UserData {
userId: string;
name: string;
role: 'ADMIN' | 'USER'; // Enum처럼 사용 가능 (리터럴 타입)
}
// axios 호출 시 제네릭으로 주입
const fetchUser = async () => {
const { data } = await axios.get<UserData>('/api/user/1');
// 여기서 data. 까지만 쳐도 userId, name, role이 자동완성 됨
return data;
}
화면에 렌더링되는 동적인 데이터의 초기값과 허용 타입을 지정합니다.
useState나 Zustnad 스토어를 만들 때 사용한다.
// useState<타입>(초기값)
const [userList, setUserList] = useState<UserData[]>([]);
// userList는 무조건 UserData 객체의 배열이어야 함.
// 다른 걸 넣으려고 하면 에러 발생
- Zustand Store 예시:
interface AuthStroe {
isLoggedIn: boolean;
login: () => void;
}
// create<인터페이스> 형태로 사용
const useAuthStore = create<AuthStore>((set) => ({
isLoggedIn: false,
login: () => set({ isLoggedIn: true }),
}));
클릭, 입력, 폼 제출 시 발생하는 Event 객체의 타입을 지정한다.
e.target이 어떤 HTML 요소인지 명시하여, 내부 속성(value 등)에 안전하게 접근합니다.// HTMLInputElement에서 발생한 변경 이벤트라고 명시
const handleInputChage = (e: React.ChageEvent<HTMLInputElement>) => {
// 타입들을 지정했으므로 e.target.value가 문자열을 보장받음
consoel.log(e.target.value);
};