๐์ค๋ ๋ฐฐ์ด ๊ฒ
forwardRef
:์์ ์ปดํฌ๋ํธ์์ ์ ๋ฌ๋ฐ์ ref๋ฅผ ํ์ ์ปดํฌ๋ํธ๋ก ์ ๋ฌํ๋ ์ญํ
useImperativeHandle
:ํจ์ํ ์ปดํฌ๋ํธ์์ forwardRef์ ํจ๊ป ์ฌ์ฉํ ๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ์์ ์ปดํฌ๋ํธ ref์ ์ค์ ํ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ref๋ฅผ ์ค์ ํด์ ์์์๊ฒ ๋ณด๋ธ๋ค.
function Parent() {
const inputRef = useRef();
return (
<div>
<Input ref={inputRef} />
<button onClick={() => inputRef.current.focus()}>Focus</button>
<button onClick={() => inputRef.current.clear()}>Clear</button>
</div>
);
}
์์ ์ปดํฌ๋ํธ์์ ๋ถ๋ชจ์์ ๋ด๋ ค๋ฐ์ ref๋ฅผ ๋ฐ์์ useImperativeHandle์ ์ด์ฉํด์ ๋ฉ์๋๋ฅผ ์ค์ ํ ์ ์๋ค. ๊ทธ๋ฌ๋ฉด ๋ถ๋ชจ์ปดํฌ๋ํธ์์๋ ์ด ๋ก์ง์ ๋ํด ๋ชฐ๋ผ๋ ์ฌ์ฉํ ์ ์๋ค.
import React, { forwardRef, useImperativeHandle, useRef } from "react";
const Input = forwardRef((_, ref) => {
const inputRef = useRef();
useImperativeHandle(ref, () => ({
clear: () => {
inputRef.current.value = "";
},
focus: () => {
inputRef.current.focus();
},
}));
return (
<>
Input: <input ref={inputRef} />
</>
);
});
export default Input;
ํ์ ์คํฌ๋ฆฝํธ
์ฅ์
- ํ์ ์ด ์ง์ ๋์ด ์๋ค.
โ ์์ ์ฑ: ์ปดํ์ผ ๋จ๊ณ์์ ๋ฏธ๋ฆฌ ์ค๋ฅ๋ฅผ ๊ฐ์งํ ์ ์๋ค.
โ ๊ฐ๋ ์ฑ: ํ์ ์ ๋ณด๊ณ ๋ฌด์์ ํ๋์ง ๋ฏธ๋ฆฌ ์ ์ ์๋ค.
๋จ์
- ์ด๊ธฐ ์ค์ ์ ํด์ผํ๋ค.
- ์คํฌ๋ฆฝํธ ์ธ์ด์ ์ ์ฐ์ฑ์ด ๋ฎ์์ง๋ค.
- ์ปดํ์ผ ์๊ฐ์ด ๊ธธ์ด์ง ์ ์๋ค.
๋ฌธ๋ฒ
1. ํ์ ์ฃผ์๊ณผ ํ์ ์ถ๋ก
- ํ์ ์ฃผ์: ๋ณ์, ์์ ํน์ ๋ณํ ๊ฐ์ด ๋ฌด์จ ํ์ ์ธ์ง๋ฅผ ๋ํ๋ด๋ ๊ฒ์ ์๋ฏธ
- ํ์ ์ถ๋ก : ํด๋น ๋ณ์๊ฐ ์ด๋ค ํ์ ์ธ์ง ์ถ๋ก ํ๋ ๊ฒ. ์๋ตํ๋ฉด ์ปดํ์ผ ํ์์ ์์๋ธ๋ค.
let a: number = 1; //ํ์
์ฃผ์
let b = 2; //ํ์
์ ๋ช
์ํ์ง ์์์ง๋ง ์ปดํ์ผ ํ์์ b์ ํ์
์ด number์ผ ๊ฒ์ด๋ผ๊ณ ์ถ๋ก
let c = {a: 1}; //์ดํ์ c.b๋ฑ์ผ๋ก ๊ฐ ์ถ๊ฐ๊ฐ ๋ถ๊ฐ๋ฅํด์ง๋ค.
let d: number[] = []; //number๋ก ํ์
์ ์ง์ ํ๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ํ์
์ ๊ฐ์ ๋ฃ์ ์ ์๋ค.
let e: 'good' = 'good'; //ํน์ ๋ฌธ์์ด, ๊ฐ ๋ฑ์ ํ์
์ผ๋ก ์ง์ ํ์ฌ ๊ทธ ๊ฐ๋ง ์ฐ๋๋ก ๊ฐ์ ํ ์ ์๋ค.
let g: any = 3; //any๋ ์๋ฌด ํ์
์ด๋ ๋ฃ์ ์ ์๋ค.
function add(a: number, b:number): number {
return a+ b;
}
//a, b, ๋ฆฌํด ๊ฐ์ ํ์
์ ์ง์ ํ ์ ์๋ค.
2. ์ธํฐํ์ด์ค
:๊ฐ์ฒด์ ํ์ ์ ์ง์ ํ๋ ๋ฐฉ๋ฒ. interface๋ผ๋ ํค์๋๋ก ๊ฐ๋ฅํ๋ค.
interface Company {
name: string;
age: number;
address?: string; //์ ํ์์ฑ (Optional)
}
/**์ธํฐํ์ด์ค๋ก ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ฉด ์ธํฐํ์ด์ค์ ์๋ name, age, address๋ ๋ฌด์กฐ๊ฑด ํ๋กํผํฐ๋ก
*์ถ๊ฐํด์ผ ํ๋ค.
*ํ์ง๋ง address์๋ ? ์ต์
๋์ด ๋ถ์ด์์ผ๋ฏ๋ก ์์ด๋ ์ค๋ฅ๊ฐ ๋์ง ์๋๋ค.
*/
const cobalt: Company = {
name: "cobalt",
age: 3,
address: "Seoul" //์์ด๋ ๋จ
}
/**์ต๋ช
์ธํฐํ์ด์ค
*์ธํฐํ์ด์ค๋ฅผ ๋ฐ๋ก ์ค์ ํด์ ์ด๋ฆ์์ด ์ฌ์ฉํ ์ ์๋ค.
*ํ๋ฒ๋ง ์ฌ์ฉํ๋ค๋ฉด ์ต๋ช
์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ์ ํ ์๋ ์๋ค.
*/
const person: {
name: string,
age?: number
} = {
name: "Lee",
age: 100
}
3. tuple
:๋ฐฐ์ด์ Tuble๋ก ์ด์ฉํ๋ ๋ฐฉ๋ฒ
//๋ฐฐ์ด ๊ฐ์ ํ์
์ ์ง์ ํ์ฌ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
const tuple: [string, number] = ['Lee', 100];
4. enum
:์ด๊ฑฐํ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
enum Color {
RED,
GREEN,
BLUE
}
const color = Color.BLUE;
/**enum์ ํตํด์ ๊น๋ํ๊ฒ ์ฌ์ฉํ ์ ์๋ค. ์ด๊ฑฐ๋ ํด๋น ๊ฐ๋ค์๋ ์์๋๋ก ์ซ์๊ฐ ๋ค์ด๊ฐ๋๋ฐ ๋ง์ฝ
*์ซ์๊ฐ ๋ค์ด๊ฐ๋ ๊ฒ ์ซ๋ค๋ฉด
*/
enum Color {
RED='red',
GREEN='green',
BLUE='blue'
}
//์ด๋ ๊ฒ ์ปค์คํ
์์ ์ฌ์ฉํ ์ ์๋ค.
5. ๋์ํ์
:์ฌ๋ฌ ์๋ฃํ์ ๊ฐ์ ๊ฐ์ง ์ ์๊ฒ ํ๋ ๋ฐฉ๋ฒ
โ ํฉ์งํฉ ํ์ ๊ณผ ๊ต์งํฉ ํ์ ์ด ์๋ค.
//ํฉ์งํฉ ํ์
// | ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ด๋ ํ ํ์
์๋ง ์ํด๋ ์ค๋ฅ๊ฐ ๋จ์ง ์๋๋ค.
let numOrStr: number | string = 1;
//๊ต์งํฉ ํ์
//๋ ๊ฐ์ ํ์
์ด ๋ ๋ค ํฌํจ๋์ด์ผ ํ๋ค.
let numAndStr: number & string = '';
//ํ์ง๋ง number์ string์ด ๋๋ค ํฌํจ๋๋ค๋ ๊ฒ์ ๋ง์ด ์๋จ
// -> ์์ ํ์
์์๋ ์ฌ์ฉํ ์ ์๋ค!
// ์ธํฐํ์ด์ค์์ ์ ์ฉํ๊ฒ ์ฌ์ฉ ๊ฐ๋ฅ
interface Name {
name: string
}
interface Age {
age: number
}
let nameAndage: Name & Age = {
name: 'yoo',
age: 44
} //Name๊ณผ Age ๋ชจ๋ ํฌํจ๋์ด์ผ ์ค๋ฅ๊ฐ ๋จ์ง ์๋๋ค.
type Person = Name & Age;
//type์ ์ฌ์ฉํด์ ํ์
์ ๋ง๋ค ์ ์๋ค. ๊ทธ๋ฌ๋ฉด ๋ ํธํ๊ฒ ์ฌ์ฉ ๊ฐ๋ฅ
let hee: Person = {
name: 'hee',
age: 100
}
6. Optional
interface Post {
title: string;
content: string;
}
interface ResponseData {
post?: Post;
message?: string;
status: number;
}
const response: ResponseData[] = [
{
post: {
title: 'Hello',
content: 'How are you?'
},
status: 200
},
{
message: 'Error!',
status: 500
}
];
console.log(response[1].post && response[1].post.title);
//์ต์
๋ ์ฒด์ด๋์ด ์๊ธฐ๊ธฐ ์ด์ ์๋ &&์ด์ฉํด์ ๊ฐ์ด ์๋์ง ํ์ธ. ์์ผ๋ฉด undefined ๋ฐํ
console.log(response[1].post?.title); //post๊ฐ ์์ผ๋ฉด ์๋์ผ๋ก undefined ๋ฐํ
console.log(response[1].post!.title); //๋๋ํ๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ฌด์กฐ๊ฑด ๊ฐ์ด ์๋ค๋ ์๋ฏธ
7. Generic
:ํ๋์ ์ธํฐํ์ด์ค๋ก ์ฌ๋ฌ ํ์ ์ ์ด์ฉํ ์ ์๊ฒ ํ๋ ๋ฐฉ๋ฒ
interface Value<T> {
value: T;
}
//Value ์ธํฐํ์ด์ค๋ฅผ ์ฌ๋ฌ ํ์
์ผ๋ก ์ฌ์ฉํ๊ณ ์ถ์ ๋ generic์ ์ด์ฉํ๋ค.
const value1: Value<number> = {//๊บฝ์ ์์ ์ํ๋ ํ์
์ ๋ฃ์ด์ ์ฌ์ฉํ๋ฉด ๋๋ค.
value: 1
}
const value2: Value<string> = {
value: '1'
}
//ํจ์์๋ ์ฌ์ฉํ ์ ์๋ค.
function toString<T>(a: T):string {
return `${a}`
}
toString<number>(5);
toString<string>('5');
toString('5');
//ํ์
์ ์๋ตํ ์๋ ์๋๋ฐ ๊ทธ๋ฌ๋ฉด ํ์
์ถ๋ก ์ด ๋์ ๋งค๊ฐ๋ณ์์ ํ์
์๋ณด๊ณ
//์์์ ํ์
์ ์ถ๋ก ํ๋ค.
8. Partial, Required, Pick, Omit
: ๊ธฐ์กด interface๋ฅผ ๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ์ฌํ์ฉํ ์ ์๊ฒ ๋๋ค.
interface User {
id: number;
name: string;
age: number;
address: string;
createAt?: string;
updateAt?: string;
}
//Partical ๋ชจ๋ ํ๋๋ฅผ Optional๋ก ๋ง๋ ๋ค.
const partial: Partial<User> = {}
//Required ๋ชจ๋ ํํธ๊ฐ Required๊ฐ ๋๋ค.
const require: Required<User> = {
id: 1,
name: 'Lee',
age: 0,
address: 'Seoul',
createAt: '',
updateAt: '',
}
//createAt๊ณผ updateAt์ ์ต์
๋์์๋ Required์ ์ํด ํ์๊ฐ์ด ๋์๋ค.
//Pick ํน์ ํ๋๋ง ๊ณจ๋ผ์ ์ฌ์ฉํ ์ ์๋ค.
//๋๋ฒ์งธ๋ก ๋ฐ๋ ํ๋๋ง ๊ณจ๋ผ์ ์ฌ์ฉํ ์ ์๋ค.
const pick: Pick<User, 'name' | 'age'> = {
name: '',
age: 100
}
//omit ํน์ ํ๋๋ง ๋นผ๊ณ ์ฌ์ฉํ ์ ์๋ค.
const omit: Omit<User, 'id' | 'age' | 'address'> = {
name: '',
}
//name, age, address๋ฅผ ๋ฐ๋๋ฐ name๋ง required๋ก ํ๊ณ ์ถ์๋?
const mixed: Omit<User, 'id' | 'address' | 'age' | 'createAt' | 'updateAt'>& Pick<Partial<User>, 'address' | 'age'> = {
name: '',
}
9. extends
: ํน์ ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ์ ์ธํฐํ์ด์ค๋ฅผ ํ์ฅํ ์ ์๋ค.
interface Time {
hour: number;
minute: number;
second: number;
}
interface DateTime extends Time {
year: number;
month: number;
day: number;
}
interface OffsetDateTime extends DateTime {
offset: 'number';
}
interface ZonedDateTime extends DateTime {
zoneId: 'string';
}
interface TimeFormat extends Pick<Time, 'hour' | 'minute'> {
ampm: 'am' | 'pm';
}
const timeFormat: TimeFormat = {
hour: 10,
minute: 30,
ampm: 'am'
}
๐ญ๋ฐฐ์ด ์
ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ค์ ๋ก ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ์ด๋ ค์ด ๊ฒ ๊ฐ๋ค! ๋ค๋ฅธ ๊ฐ์๋ฅผ ์ฐพ์์ ๋ณด๋ฉด์ ์ตํ์ผ ํ ๋ฏ์ถ๋ค.
'์ผ์ > Today I Learned' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
2023.01.04 (0) | 2023.01.04 |
---|---|
[๋ฐ๋ธ์ฝ์ค Day53] 2022.12.28 (0) | 2022.12.28 |
[๋ฐ๋ธ์ฝ์ค Day51] 2022.12.26 (0) | 2022.12.26 |
[๋ฐ๋ธ์ฝ์ค Day 50] 2022.12.23 (0) | 2022.12.23 |
[๋ฐ๋ธ์ฝ์ค Day49] 2022.12.22 (0) | 2022.12.22 |
๐์ค๋ ๋ฐฐ์ด ๊ฒ
forwardRef
:์์ ์ปดํฌ๋ํธ์์ ์ ๋ฌ๋ฐ์ ref๋ฅผ ํ์ ์ปดํฌ๋ํธ๋ก ์ ๋ฌํ๋ ์ญํ
useImperativeHandle
:ํจ์ํ ์ปดํฌ๋ํธ์์ forwardRef์ ํจ๊ป ์ฌ์ฉํ ๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ์์ ์ปดํฌ๋ํธ ref์ ์ค์ ํ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ref๋ฅผ ์ค์ ํด์ ์์์๊ฒ ๋ณด๋ธ๋ค.
function Parent() {
const inputRef = useRef();
return (
<div>
<Input ref={inputRef} />
<button onClick={() => inputRef.current.focus()}>Focus</button>
<button onClick={() => inputRef.current.clear()}>Clear</button>
</div>
);
}
์์ ์ปดํฌ๋ํธ์์ ๋ถ๋ชจ์์ ๋ด๋ ค๋ฐ์ ref๋ฅผ ๋ฐ์์ useImperativeHandle์ ์ด์ฉํด์ ๋ฉ์๋๋ฅผ ์ค์ ํ ์ ์๋ค. ๊ทธ๋ฌ๋ฉด ๋ถ๋ชจ์ปดํฌ๋ํธ์์๋ ์ด ๋ก์ง์ ๋ํด ๋ชฐ๋ผ๋ ์ฌ์ฉํ ์ ์๋ค.
import React, { forwardRef, useImperativeHandle, useRef } from "react";
const Input = forwardRef((_, ref) => {
const inputRef = useRef();
useImperativeHandle(ref, () => ({
clear: () => {
inputRef.current.value = "";
},
focus: () => {
inputRef.current.focus();
},
}));
return (
<>
Input: <input ref={inputRef} />
</>
);
});
export default Input;
ํ์ ์คํฌ๋ฆฝํธ
์ฅ์
- ํ์ ์ด ์ง์ ๋์ด ์๋ค.
โ ์์ ์ฑ: ์ปดํ์ผ ๋จ๊ณ์์ ๋ฏธ๋ฆฌ ์ค๋ฅ๋ฅผ ๊ฐ์งํ ์ ์๋ค.
โ ๊ฐ๋ ์ฑ: ํ์ ์ ๋ณด๊ณ ๋ฌด์์ ํ๋์ง ๋ฏธ๋ฆฌ ์ ์ ์๋ค.
๋จ์
- ์ด๊ธฐ ์ค์ ์ ํด์ผํ๋ค.
- ์คํฌ๋ฆฝํธ ์ธ์ด์ ์ ์ฐ์ฑ์ด ๋ฎ์์ง๋ค.
- ์ปดํ์ผ ์๊ฐ์ด ๊ธธ์ด์ง ์ ์๋ค.
๋ฌธ๋ฒ
1. ํ์ ์ฃผ์๊ณผ ํ์ ์ถ๋ก
- ํ์ ์ฃผ์: ๋ณ์, ์์ ํน์ ๋ณํ ๊ฐ์ด ๋ฌด์จ ํ์ ์ธ์ง๋ฅผ ๋ํ๋ด๋ ๊ฒ์ ์๋ฏธ
- ํ์ ์ถ๋ก : ํด๋น ๋ณ์๊ฐ ์ด๋ค ํ์ ์ธ์ง ์ถ๋ก ํ๋ ๊ฒ. ์๋ตํ๋ฉด ์ปดํ์ผ ํ์์ ์์๋ธ๋ค.
let a: number = 1; //ํ์
์ฃผ์
let b = 2; //ํ์
์ ๋ช
์ํ์ง ์์์ง๋ง ์ปดํ์ผ ํ์์ b์ ํ์
์ด number์ผ ๊ฒ์ด๋ผ๊ณ ์ถ๋ก
let c = {a: 1}; //์ดํ์ c.b๋ฑ์ผ๋ก ๊ฐ ์ถ๊ฐ๊ฐ ๋ถ๊ฐ๋ฅํด์ง๋ค.
let d: number[] = []; //number๋ก ํ์
์ ์ง์ ํ๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ํ์
์ ๊ฐ์ ๋ฃ์ ์ ์๋ค.
let e: 'good' = 'good'; //ํน์ ๋ฌธ์์ด, ๊ฐ ๋ฑ์ ํ์
์ผ๋ก ์ง์ ํ์ฌ ๊ทธ ๊ฐ๋ง ์ฐ๋๋ก ๊ฐ์ ํ ์ ์๋ค.
let g: any = 3; //any๋ ์๋ฌด ํ์
์ด๋ ๋ฃ์ ์ ์๋ค.
function add(a: number, b:number): number {
return a+ b;
}
//a, b, ๋ฆฌํด ๊ฐ์ ํ์
์ ์ง์ ํ ์ ์๋ค.
2. ์ธํฐํ์ด์ค
:๊ฐ์ฒด์ ํ์ ์ ์ง์ ํ๋ ๋ฐฉ๋ฒ. interface๋ผ๋ ํค์๋๋ก ๊ฐ๋ฅํ๋ค.
interface Company {
name: string;
age: number;
address?: string; //์ ํ์์ฑ (Optional)
}
/**์ธํฐํ์ด์ค๋ก ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ฉด ์ธํฐํ์ด์ค์ ์๋ name, age, address๋ ๋ฌด์กฐ๊ฑด ํ๋กํผํฐ๋ก
*์ถ๊ฐํด์ผ ํ๋ค.
*ํ์ง๋ง address์๋ ? ์ต์
๋์ด ๋ถ์ด์์ผ๋ฏ๋ก ์์ด๋ ์ค๋ฅ๊ฐ ๋์ง ์๋๋ค.
*/
const cobalt: Company = {
name: "cobalt",
age: 3,
address: "Seoul" //์์ด๋ ๋จ
}
/**์ต๋ช
์ธํฐํ์ด์ค
*์ธํฐํ์ด์ค๋ฅผ ๋ฐ๋ก ์ค์ ํด์ ์ด๋ฆ์์ด ์ฌ์ฉํ ์ ์๋ค.
*ํ๋ฒ๋ง ์ฌ์ฉํ๋ค๋ฉด ์ต๋ช
์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ์ ํ ์๋ ์๋ค.
*/
const person: {
name: string,
age?: number
} = {
name: "Lee",
age: 100
}
3. tuple
:๋ฐฐ์ด์ Tuble๋ก ์ด์ฉํ๋ ๋ฐฉ๋ฒ
//๋ฐฐ์ด ๊ฐ์ ํ์
์ ์ง์ ํ์ฌ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
const tuple: [string, number] = ['Lee', 100];
4. enum
:์ด๊ฑฐํ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
enum Color {
RED,
GREEN,
BLUE
}
const color = Color.BLUE;
/**enum์ ํตํด์ ๊น๋ํ๊ฒ ์ฌ์ฉํ ์ ์๋ค. ์ด๊ฑฐ๋ ํด๋น ๊ฐ๋ค์๋ ์์๋๋ก ์ซ์๊ฐ ๋ค์ด๊ฐ๋๋ฐ ๋ง์ฝ
*์ซ์๊ฐ ๋ค์ด๊ฐ๋ ๊ฒ ์ซ๋ค๋ฉด
*/
enum Color {
RED='red',
GREEN='green',
BLUE='blue'
}
//์ด๋ ๊ฒ ์ปค์คํ
์์ ์ฌ์ฉํ ์ ์๋ค.
5. ๋์ํ์
:์ฌ๋ฌ ์๋ฃํ์ ๊ฐ์ ๊ฐ์ง ์ ์๊ฒ ํ๋ ๋ฐฉ๋ฒ
โ ํฉ์งํฉ ํ์ ๊ณผ ๊ต์งํฉ ํ์ ์ด ์๋ค.
//ํฉ์งํฉ ํ์
// | ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ด๋ ํ ํ์
์๋ง ์ํด๋ ์ค๋ฅ๊ฐ ๋จ์ง ์๋๋ค.
let numOrStr: number | string = 1;
//๊ต์งํฉ ํ์
//๋ ๊ฐ์ ํ์
์ด ๋ ๋ค ํฌํจ๋์ด์ผ ํ๋ค.
let numAndStr: number & string = '';
//ํ์ง๋ง number์ string์ด ๋๋ค ํฌํจ๋๋ค๋ ๊ฒ์ ๋ง์ด ์๋จ
// -> ์์ ํ์
์์๋ ์ฌ์ฉํ ์ ์๋ค!
// ์ธํฐํ์ด์ค์์ ์ ์ฉํ๊ฒ ์ฌ์ฉ ๊ฐ๋ฅ
interface Name {
name: string
}
interface Age {
age: number
}
let nameAndage: Name & Age = {
name: 'yoo',
age: 44
} //Name๊ณผ Age ๋ชจ๋ ํฌํจ๋์ด์ผ ์ค๋ฅ๊ฐ ๋จ์ง ์๋๋ค.
type Person = Name & Age;
//type์ ์ฌ์ฉํด์ ํ์
์ ๋ง๋ค ์ ์๋ค. ๊ทธ๋ฌ๋ฉด ๋ ํธํ๊ฒ ์ฌ์ฉ ๊ฐ๋ฅ
let hee: Person = {
name: 'hee',
age: 100
}
6. Optional
interface Post {
title: string;
content: string;
}
interface ResponseData {
post?: Post;
message?: string;
status: number;
}
const response: ResponseData[] = [
{
post: {
title: 'Hello',
content: 'How are you?'
},
status: 200
},
{
message: 'Error!',
status: 500
}
];
console.log(response[1].post && response[1].post.title);
//์ต์
๋ ์ฒด์ด๋์ด ์๊ธฐ๊ธฐ ์ด์ ์๋ &&์ด์ฉํด์ ๊ฐ์ด ์๋์ง ํ์ธ. ์์ผ๋ฉด undefined ๋ฐํ
console.log(response[1].post?.title); //post๊ฐ ์์ผ๋ฉด ์๋์ผ๋ก undefined ๋ฐํ
console.log(response[1].post!.title); //๋๋ํ๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ฌด์กฐ๊ฑด ๊ฐ์ด ์๋ค๋ ์๋ฏธ
7. Generic
:ํ๋์ ์ธํฐํ์ด์ค๋ก ์ฌ๋ฌ ํ์ ์ ์ด์ฉํ ์ ์๊ฒ ํ๋ ๋ฐฉ๋ฒ
interface Value<T> {
value: T;
}
//Value ์ธํฐํ์ด์ค๋ฅผ ์ฌ๋ฌ ํ์
์ผ๋ก ์ฌ์ฉํ๊ณ ์ถ์ ๋ generic์ ์ด์ฉํ๋ค.
const value1: Value<number> = {//๊บฝ์ ์์ ์ํ๋ ํ์
์ ๋ฃ์ด์ ์ฌ์ฉํ๋ฉด ๋๋ค.
value: 1
}
const value2: Value<string> = {
value: '1'
}
//ํจ์์๋ ์ฌ์ฉํ ์ ์๋ค.
function toString<T>(a: T):string {
return `${a}`
}
toString<number>(5);
toString<string>('5');
toString('5');
//ํ์
์ ์๋ตํ ์๋ ์๋๋ฐ ๊ทธ๋ฌ๋ฉด ํ์
์ถ๋ก ์ด ๋์ ๋งค๊ฐ๋ณ์์ ํ์
์๋ณด๊ณ
//์์์ ํ์
์ ์ถ๋ก ํ๋ค.
8. Partial, Required, Pick, Omit
: ๊ธฐ์กด interface๋ฅผ ๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ์ฌํ์ฉํ ์ ์๊ฒ ๋๋ค.
interface User {
id: number;
name: string;
age: number;
address: string;
createAt?: string;
updateAt?: string;
}
//Partical ๋ชจ๋ ํ๋๋ฅผ Optional๋ก ๋ง๋ ๋ค.
const partial: Partial<User> = {}
//Required ๋ชจ๋ ํํธ๊ฐ Required๊ฐ ๋๋ค.
const require: Required<User> = {
id: 1,
name: 'Lee',
age: 0,
address: 'Seoul',
createAt: '',
updateAt: '',
}
//createAt๊ณผ updateAt์ ์ต์
๋์์๋ Required์ ์ํด ํ์๊ฐ์ด ๋์๋ค.
//Pick ํน์ ํ๋๋ง ๊ณจ๋ผ์ ์ฌ์ฉํ ์ ์๋ค.
//๋๋ฒ์งธ๋ก ๋ฐ๋ ํ๋๋ง ๊ณจ๋ผ์ ์ฌ์ฉํ ์ ์๋ค.
const pick: Pick<User, 'name' | 'age'> = {
name: '',
age: 100
}
//omit ํน์ ํ๋๋ง ๋นผ๊ณ ์ฌ์ฉํ ์ ์๋ค.
const omit: Omit<User, 'id' | 'age' | 'address'> = {
name: '',
}
//name, age, address๋ฅผ ๋ฐ๋๋ฐ name๋ง required๋ก ํ๊ณ ์ถ์๋?
const mixed: Omit<User, 'id' | 'address' | 'age' | 'createAt' | 'updateAt'>& Pick<Partial<User>, 'address' | 'age'> = {
name: '',
}
9. extends
: ํน์ ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ์ ์ธํฐํ์ด์ค๋ฅผ ํ์ฅํ ์ ์๋ค.
interface Time {
hour: number;
minute: number;
second: number;
}
interface DateTime extends Time {
year: number;
month: number;
day: number;
}
interface OffsetDateTime extends DateTime {
offset: 'number';
}
interface ZonedDateTime extends DateTime {
zoneId: 'string';
}
interface TimeFormat extends Pick<Time, 'hour' | 'minute'> {
ampm: 'am' | 'pm';
}
const timeFormat: TimeFormat = {
hour: 10,
minute: 30,
ampm: 'am'
}
๐ญ๋ฐฐ์ด ์
ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ค์ ๋ก ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ์ด๋ ค์ด ๊ฒ ๊ฐ๋ค! ๋ค๋ฅธ ๊ฐ์๋ฅผ ์ฐพ์์ ๋ณด๋ฉด์ ์ตํ์ผ ํ ๋ฏ์ถ๋ค.
'์ผ์ > Today I Learned' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
2023.01.04 (0) | 2023.01.04 |
---|---|
[๋ฐ๋ธ์ฝ์ค Day53] 2022.12.28 (0) | 2022.12.28 |
[๋ฐ๋ธ์ฝ์ค Day51] 2022.12.26 (0) | 2022.12.26 |
[๋ฐ๋ธ์ฝ์ค Day 50] 2022.12.23 (0) | 2022.12.23 |
[๋ฐ๋ธ์ฝ์ค Day49] 2022.12.22 (0) | 2022.12.22 |