
Typescript 란 자바스크립트의 타입을 강제시키는 언어
javascript 는 type 검사가 엄격하지 않음
따라서 변수, 상수를 만들면 처음에는 문자를 넣었다가, 나중에 다른 type 으로 재할당이 가능 [이런 점은 편리해 보이지만 큰 서비스 개발 시 문제발생 가능]



/* 배열타입 */
// 문자열만 있는 배열
let aaa:string[] = ["원두","은정","혜원"]
// 배열에 문자열과 숫자열을 같이 넣어두고 싶을 때
let fff:(string | number)[] = [1,2,3,"철수","영희"]
// 모두 숫자이거나 모두 문자인 배열
let hhh: string[] | nuber[] =[ "영희","철수" ]
hhh=[1,2,3]


객체타입의 경우 interface를 이용해 type 지정 객체를 따로 만들어 줌
[객체는 네이밍 관례가 있음 => interface의 I + 변수명]
ex. 객체 변수이름이 Object라면 type객체의 이름은 IObject가 됨
hobby?: string] 로 입력하면 있어도 되고, 없어도 되는 값으로 취급( ? => ~가 있으면 )typescript 에는 ts, tsx 라는 두 개의 확장자가 있음
return 부분에 JSX 가 포함되어 있으면 tsx, 단순히 javascript 관련 기능만 있는 경우 ts 로 확장자명을 지정
[ts 확장자는 jsx를 읽어들이지 못함!]
const add2 = (num1: number, num2: number, unit: string): string => {
return num1 + num2 + unit
}
함수는 각 매개변수와 return 될 값의 type을 지정해 줘야함 [return이 없을 경우 void 지정]
-위 함수는 각 매개변수 type이 number, number, string로 지정되었고, return 값의 type은 String 으로 지정됨
*함수의 매개변수는 암묵적으로 any로 판단됨 (함수에 따라 어떤 type이 들어갈지 알 수 없기 때문! 타입추론이 불가능)
//매개변수의 type 지정
const add = (a: number, b: number):number => {
return a + b;
};
return (
// 컴포넌트의 JSX부분
<Component add={add} />
);
//return 값이 없는 경우
const add = (a: number, b: number): void => {a + b};
위처럼 함수를 props로 넘겨 줄 때 함수의 각 매개변수 type, return 값의 type 도 지정해줘야 함
(return 값이 없다면 :void 입력)
-return의 type은 생략가능(생략 시 타입추론으로 type 임의 지정)
BUT! 오류를 방지하기 위해 명시해 주는 것이 좋음
interface IProps {
add: (a: number, b: number) => number;
}
const Component2 = (props: IProps) => {
props.add(1, 2);
return (
//컴포넌트의 JSX부분
);
};
이벤트 발생 시 함수의 매개변수에 인자로 받아오는 event 객체의 type도 지정해줘야 함

ChangeEvent 를 활용 (import로 가져올 수 있음)

event: ChangeEvent<HTML inputelement> 로 event의 type을 지정<HTMLTextAreaElement>
const profile = {
name : "철수",
age : 12,
school: {
name : "다람쥐 초등학교",
location : "서울시 구로구"
}
}
interface IMyProfile = {
name : string;
age : age;
school?: {
name : string;
location : string;
}
}
1. Partial
type profile = Partial<IMyProfile>
? 붙음, 있어도 되고 없어도 되고)2. Required
type profile = Required<IMyProfile>
전체 type을 required한 type으로 변경 (모든 type은 필수로 있어야 함)
3. Pick
type profile = Pick<IMyProfile, "name", "age">
// name과 age 타입만 지정
4. Omit
type profile = Omit<IMyProfile, "school">
// school 타입만 제거 = name과 age 타입만 지정
5. Union
type union = "school" | "name"
// school과 name 타입만 지정
6. Record
type union = "school" | "name"
type RecordType = Record<union, IMyProfile>
// school과 name의 각각의 타입에는 IMyProfile가 지정
7. 객체의 key들을 이용해서 Union type 만들기
type ggg = keyof IProfile // keyof 메소드로 IProfile의 key만 뽑아옴
let myProfile: ggg // IProfile의 각 key인 name, age, school만 가능
keyof 메소드를 활용해 뽑아서 ggg에 담음ggg를 지정graphql-codegen 을 이용해 백엔드 컴퓨터에 접속해서 grphql-API 로 받아오는(요청하는) 모든 데이터의 type을 조사하고, 각각의 일치하는 ts파일을 지정한 경로에 자동으로 생성해 줌// 결과타입과 변수타입은 types.ts 파일에서 import해서 데리고 오시면 됩니다.
const [함수] = useMutation<결과타입,변수타입>(쿼리);
/* 실제 코드에 적용해보기 */
// 다운로드된 타입들 중 맞는 타입을 데리고 올때는 Pick을 이용하며 해당 타입을 import해와야 합니다.
// 강의에서는 타입파일에서 Mutation과 IMutationCreateBoardArgs를 import해왔습니다.
// 우리는 IMutation 중에서 createBoard를 픽해올 것 입니다.
const [createBoard] = useMutation<Pick<IMutation, "createBoard">, IMutationCreateBoardArgs>(CREATE_BOARD);
const onClickUpload = async () => {
const result = await createBoard(CREARTE_BOARD);
console.log(result.data?.createBoard?.message);
}
Imutation 내에 있는 여러 mutation type들 중 createBoard 를 가져옴
ImutationCreateBoardArgs = creatBoard 의 variables들
이 두가지(IMutation 안의 createBoard, IMutationcreateBoardArgs)를 pick 해서 type으로 사용
*Import로 가져와야 사용 가능
// 결과타입과 변수타입은 types.ts 파일에서 import해서 데리고 오시면 됩니다.
const { data } = useQuery<Pick<IQuery,"fetchBoard">,IQueryFetchBoardArgs>(FETCH_BOARD,{
variables: {number: Number(router.query.mynumber)}
})
IQuery 내의 여러 Query type들 중 fetchBoard 를 가져옴
IQueryFetchBoards =FetchBoards 의 variables들
이 두가지(IQuery 안의 createBoard, IQueryFetchBoardsArgs)를 pick 해서 type으로 사용
*Import로 가져와야 사용 가능