const formatDate = (d: Date): string => { // ✅
const year = d.getFullYear();
const month = d.getMonth() + 1;
const day = d.getDate();
return `${year}년 ${month}월 ${day}일`;
};
const today = formatDate(new Date());
console.log(today);
// lang의 경우 인자를 전달하지 않으면 "ko"라는 문자열 값이 할당
// delimiter는 물음표를 사용하여 선택적으로 인자 전달
let formatDate = (d: Date | number, lang = "ko", delimiter?: string): string => {
};
// Category라는 이름의 enum 타입을 정의한다
// Category의 enum 값에 Past, Pizza, Dessert 가 있다.
enum Category {
Pasta,
Pizza,
Dessert
}
let menuCategory: Category = Category.Pasta; // 0
// enum에 값 부여
enum Category {
Pasta = 'pasta',
Pizza = 'pizza',
Dessert = 'dessert'
}
let menuCategory: Category = Category.Pasta; // pasta
function formatDate(date: string | number | Date): string {
// 로직 생략
return `${year}년 ${month}월 ${day}일`
}
formatDate(20201028);
formatDate(new Date());
formatDate('20201028');
// union
let starNumberArr: (number | string)[] = [1, 2];
starNumberArr.push("3점");
// tuple
let starArr: [number, string] = [1, "1점"];
// 방법은 아래처럼 type으로 정의하거나, interface로 타입을 정의하거나.
type ID = number | string;
//checkInfo 함수의 매개변수 info 객체를 위해 Info라는 타입을 만들기.
type Info = {
id: ID;
pw: string;
};
function checkInfo(info: Info) {
}
let id: ID = "1010";
checkInfo({ id, pw: "password" });
// ts 파일에서
let starArr = [1, 2, 3];
starArr.push('4점');
// 에러: Argument of type 'string' is not assignable to parameter of type 'number'.
// starArr는 숫자로만 이루어진 배열이 할당되어, number[] 타입으로 추론됨 => 에러 발생!
state와 props의 타입을 정의하는데 주로 사용
readonly
, ?
키워드 사용
// readonly는 읽기만 가능한 프로퍼티로, 값을 수정할 수 없습니다.
// 프로퍼티명 다음에 물음표(?)를 사용하면 해당프로퍼티를 추가해도 되고 안해도 됩니다.
interface Restaurant {
readonly name: string;
star: number;
address?: string;
}
const chroad3: Restaurant = {
name: "취향로3가",
star: 5,
};
chroad3.name = "chroad3"; // 에러: Cannot assign to 'name' because it is a read-only property.
chroad3.star = 4;
const sipboon: Restaurant = {
name: "십분의일",
star: 5,
address: "을지로3가",
};
extends
사용 : 기존에 정의된 인터페이스를 확장interface BasicInfo {
name: string;
star: number;
}
const sipboon: BasicInfo = {
name: "십분의일",
star: 5,
};
// extends
interface DetailInfo extends BasicInfo {
address: string;
phone: string;
position: number[];
}
const chroad3: DetailInfo = {
name: "취향로3가",
star: 5,
address: "을지로3가",
phone: "123-456-7890",
position: [37.565496, 126.99142],
};
type
사용 & 기호
를 사용하여 기존에 정의했던 인터페이스를 합쳐서 새로운 타입을 만드는 것interface BasicInfo {
name: string;
star: number;
}
interface DetailInfo {
position: number[];
}
type Info = BasicInfo & DetailInfo;
Q. v1, v2 둘 중에 어떤 라인이 에러가 날까?
function getStar(score: number | string, scoreNum: number) {
const v1: number = score;
const v2: number | string = scoreNum;
}
function makeArr<T>(el: T): T[] {
return [el];
}
makeArr<number>(1); // 1 number[]
makeArr<string>("1점"); // 2 string[]
makeArr<boolean>(true); // 3 boolean[]
makeArr(1);
makeArr("1점");
makeArr(true);
object
, interface
, type alias
세 가지!1. 리액트의 FC 타입 사용
interface StarsProps { // prop 타입 정의
star: number;
}
const Stars: React.FC<StarsProps> = ({ star }) => { //
return (
<div>
{makeStars(star)}
</div>
)
}
2. 일반적인 함수정의 방식
interface StarsProps { // prop 타입 정의
star: number;
}
const Stars = ({ star }: StarsProps): JSX.Element => { //
return (
<div>
{makeStars(star)}
</div>
)
}
const [like, setLike] = useState(false);
useState<boolean>(initialState: boolean | (() => boolean))
: [boolean, Dispatch<SetStateAction<boolean>>]
// 유니온 타입으로 전달
const [like, setLike] = useState<boolean | null>(null);
// state 타입 정의
interface Comment {
comment: string;
username: string;
date: string;
star: number;
}
const [comments, setComments] = useState<Comment[]>([]);
const reviewRef = useRef<HTMLDivElement>(null);
//로직 생략
return (
<>
<Review reviewTextRef={reviewRef} />
<div ref={reviewRef}>
리뷰
</div>
</>
)
declare global {
interface Window {
kakao: any;
}
}