TS에서는 변수의 타입을 지정해줘야 한다!
JS에서는 아무렇게나 선언하고 초기화하고 바꿔도 상관없지만,
TS에서는 그러면 맴매 맞는다!
타입지정 : 기본 자료형들
String, Number, Boolean, Undefined, Null
-> 여기서 뒤에 []를 붙여 배열, [number, string] 등을 붙여 튜플 자료형을 지정할 수 있음.
타입 지정 : 객체
let product: {
id: string;
price: number;
membersOnly?: boolean; // 필수가 아닌 프로퍼티
sizes: string[];
} = {
id: 'c001',
price: 129000,
sizes: ['M', 'L', 'XL'],
};
if (product.membersOnly) {
console.log('회원 전용 상품');
} else {
console.log('일반 상품');
}
좀 복잡하다. 이후에 인터페이스, 타입 등을 사용하지만 일단 기본형을 기억.
let 객체명: {키:타입} = {키:밸류}; 구조
타입 지정 : 함수
function 함수명(id: string, quanity: number): boolean {
if (조건) {
return false;
}
return true;
}
다음과 같이 함수를 선언함. function 함수명(파라미터: 자료형): 리턴자료형 { 함수 }
이 때 리턴 자료형은 생략해도 자동 추론 가능!
화살표 함수를 사용할 경우, let 변수 = (파라미터:자료형) => 리턴자료형; 과 같이 작성한다.
파라미터로 Rest 파라미터가 올 경우 자료형을 배열 타입으로 작성!
Enum
흔히 아는 enum과 동일합니다!!!!
enum Size {
S,
M,
L,
XL,
}
console.log(Size.S); // 0
console.log(Size.M); // 1
숫자 0은 헷갈리기 딱이기 때문에 그냥 값을 지정해주는게 제일 좋습니다.
enum Size {
S = 'S',
M = 'M',
L = 'L',
XL = 'XL',
}
요로코롬!
인터페이스
가장 많이 사용될 것 같은데, 객체 타입처럼 만들면 됨!
interface Product { // 프로덕트 인터페이스
id: string;
price: number;
membersOnly?: boolean;
}
interface ClothingProduct extends Product { // 상속받아서 사이즈만 추가
sizes: Size[];
}
const product2: Product = {
id: 'd001',
price: 25000,
};
const product1: ClothingProduct = {
id: 'c001',
price: 129000,
membersOnly: true,
sizes: [Size.M, Size.L],
};
상속은 interface 이름 뒤에 extends 쓰고 부모 인터페이스 명을 적어두면 됨! 알지??
타입 별칭
type 별칭은 타입에 이름을 붙이는 문법이다 -> 복잡한 타입을 재사용할 때 활용 가능
type Point = [number, number];
type SearchQuery = string | string[];
type Result = SuccessResult | FailedResult;
type Coupon =
| PromotionCoupon
| EmployeeCoupon
| WelcomCoupon
| RewardCoupon
;
위 예시를 참고할 것!
keyof, typeof
interface Product {
id: string;
price: number;
membersOnly?: boolean;
}
type ProductProperty = keyof Product; // 'id' | 'price' | 'membersOnly';
keyof : 객체 타입에서 프로퍼티 이름을 모아서 타입으로 만듦.
유사하게 typeof는 객체의 타입을 갖고있음.
제네릭
제네릭은 변할 수 있는 타입을 명시할 때 사용한다.
function sum<T>(x: T, y: T): T {
return x + y;
}
sum<number>(1, 2); // 3
sum<string>('asd', 'ef'); // 'asdef'
제네릭은 <T>와 같은 방법으로 지정 -> T가 이제 변하는 것을 의미하는데, T,V와 같이 문자 하나로 쓰는것이 기본!
제네릭 타입의 함수를 호출 할 때 이제 타입을 지정해주면, T부분이 변하게 됨.
제네릭 : Map, Set
const productMap = new Map<string, Product>();
productMap.set(product1.id, product1);
productMap.set(product2.id, product2);
map은 키와 밸류를 갖는 자료구조임. 위와 같이 타입을 정의하고 사용함.
const productSet = new Set<Product>();
productSet.add(product1);
productSet.add(product2);
set은 배열이지만, 중복 불가능한 집합 같은 것.
객체에서 사용하는 타입들
const productMap: Record<string, Product> = {}
productMap['c001'] = product1;
productMap['c002'] = product2;
Record 타입은 객체를 일단 선언하는데, 키와 밸류 타입을 정해놓을 때 사용!
type ProductInfo = Pick<Product, 'name' | 'price'>;
Pick 타입은 기존 객체에서 뽑아서 새로운 타입을 만듦.
type ProductInfo = Omit<Product, 'id' | 'membersOnly'>;
Omit 타입은 기존 객체에서 뽑은 것을 뺀 나머지로 새로운 타입을 만듦.
함수에서 사용하는 타입들
type AddToCartParameters = Parameters<typeof addToCart>;
type AddToCartResult = ReturnType<typeof addToCart>;
Parameters를 통해 이미 선언된 함수 파라미터들의 타입을 가지고 새 함수 파라미터들의 타입을 정의할 수 있음.
ReturnType을 통해 리턴 타입을 가져옴!
또 막상 리액트에서 얼마나 쓰는진 아직 알 수 없지만,
이런식으로 가져옵니다. 일단 기억해가야 할 핵심은 인터페이스!
'Upscaling' 카테고리의 다른 글
HTML body의 기본 Margin(흰 테두리) (1) | 2024.05.01 |
---|---|
13. 리액트에서 사용하는 타입스크립트 (0) | 2024.04.17 |
11. Dependant, Paginated, Infinite Query (0) | 2024.03.26 |
10. 리액트 쿼리 기초 (0) | 2024.03.18 |
8. 스박사님을 아세욧? (0) | 2024.03.10 |