-
์ ํธ๋ฆฌํฐ ํ์ (Utilty Types)โจ๏ธ conceptualization/Typescript 2022. 9. 12. 16:12728x90
๐ฅ typescript์์ ๋ค์ํ๊ฒ ์ฌ์ฉ๋๋ utility type์ ๋ํ์ฌ ์์๋ณด์
1. keyof 2. Partial<T> 3. Required<T> 4. Readonly<T> 5. Record<K,T> 6. Pick<T,K> 7. Omit<T,K> 8. Exclude<T1,T2> 9. NonNullable<Type>
1. keyof ํ์
๐๐ป ๊ฐ์ฒด์ key ๊ฐ์ ์ถ์ถํ๋ค
interface User { id: number; name: string; age: number; gender: "m" | "f"; } type UserKey = keyof User; // ๐ ๋ค์๊ณผ ๊ฐ์ ํค ๊ฐ์ ๋ํ๋ธ๋ค // 'id' | 'name'| 'age'| 'gender' const uk: UserKey = "name"; // ๐ name ๊ณผ ๊ฐ์ UserKey ํ๋กํผํฐ ๊ฐ์ด ๋ค์ด๊ฐ์ง ์์ผ๋ฉด error๊ฐ ๋ฐ์ํ๋ค.
2. Partial
๐๐ป partial์ ํ๋กํผํฐ๋ฅผ ๋ชจ๋ ์ต์ ์ผ๋ก ๋ฐ๊ฟ์ค๋ค.
์์๋น๊ต
interface User { id: number; name: string; age: number; gender: "m" | "f"; } // ๐ User ํ์ ๋ด์ ํ๋กํผํฐ ๊ฐ์ด ์ผ๋ถ๋ง ๋ค์ด๊ฐ์์ผ๋ก error๊ฐ ๋ฐ์ํ๋ค let admin: User = { id: 1, name: "yelim", }
โ ์ด๋ด๋ partial์ ์ฌ์ฉํ์ฌ ํด๊ฒฐํด๋ณด์
let admin: Partial<User> = { id: 1, name: "yelim", }; // ๐ User ํ์ ์ Partial<User> ์ฒ๋ผ ๊ฐ์๋ค๋ ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ ์๋ฏธ์ด๋ค. // interface User { // id?: number; // name?: string; // age?: number; // gender?: "m" | "f"; // }
3. Required
๐๐ป (partial ์ ๋ฐ๋๊ฐ๋ ) ๋ชจ๋ ํ๋กํผํฐ๋ฅผ ํ์ ๊ฐ์ผ๋ก ๋ฐ๊ฟ์ค๋ค.
์์๋น๊ต
interface User { id: number; name: string; age?: number; // ๐ age๋ optional ๊ฐ์ผ๋ก error๊ฐ ๋์ง์๋๋ค. } let admin: User = { id: 1, name: "yelim", };
- ํ์ง๋ง
Required<User>
๋ก ๊ฐ์ธ๊ฒ ๋๋ค๋ฉด ?
interface User { id: number; name: string; age?: number; } let admin: Required<User> = { // ๐ optional ๊ฐ์ด์๋ age ํ๋กํผํฐ๊ฐ ํ์ ๊ฐ์ด ๋๋ฉฐ error message๊ฐ ๋ฐ์ํ๋ค. id: 1, name: "yelim" };
4. Readonly
๐๐ป ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ๋ฐ๊ฟ์ค๋ค.
interface User { id: number; name: string; age?: number; } let admin: Readonly<User> = { id: 1, name: "yelim", }; admin.id = 10; // ๐ ์ฝ๊ธฐ ์ ์ฉ ํ๋กํผํฐ id ๊ฐ์ ์์ ํ ์ ์๋ค.
5. Record<K,T>
๐๐ป Record<K,T> ์ฌ๊ธฐ์ K๋ key ์ด๊ณ , T๋ type์ด๋ค.
์์๋น๊ต
- ๋ค์๊ณผ ๊ฐ์ ์์ ๊ฐ ์๋ค.
interface Score { "1": "A" | "B" | "C" | "D"; "2": "A" | "B" | "C" | "D"; "3": "A" | "B" | "C" | "D"; "4": "A" | "B" | "C" | "D"; } const score: Score = { 1: "A", 2: "B", 3: "C", 4: "D", };
- ์ฌ๊ธฐ์
Record<K,T>
๋ฅผ ํ์ฉํด ๋ณด๋ฉด..
// ๐ ๋ค์๊ณผ ๊ฐ์ด ๋ํ๋ผ ์ ์๋ค. const score: Record<"1" | "2" | "3" | "4", "A" | "B" | "C" | "D"> = { 1: "A", 2: "B", 3: "C", 4: "D", };
- ์ข ๋ ์ ๋ฆฌํด์ ๋ํ๋ด๋ณด์ !
type Grade = "1" | "2" | "3" | "4"; type Score = "A" | "B" | "C" | "D"; const score: Record<Grade, Score> = { 1: "A", 2: "B", 3: "C", 4: "D", };
๋ค๋ฅธ ํ์ฉ ์์
interface User { id: number; name: string; age: number; } function isValid(user: User) { const result: Record<keyof User, boolean> = { // ๐ User์ ํค๊ฐ์ ์ฐธ์กฐ, Record<K,T>๋ฅผ ํ์ฉํ์ฌ ๋ค์๊ณผ ๊ฐ์ด ๋ํ๋ผ์ ์๋ค. id: user.id > 0, name: user.name !== "", age: user.age > 0, }; return result; }
6. Pick<T,K>
๐๐ป Pick<T,K> T ํ์ ์์ K ํ๋กํผํฐ๋ง ๊ณจ๋ผ์ ์ฌ์ฉํ๋ค.
interface User { id: number; name: string; age: number; gender: "m" | "w"; } const admin: Pick<User, "id"| "name"> = { id: 0, name: "bob", };
7. Omit<T,K>
๐๐ป Pick<T,K>๊ณผ ๋ฐ๋๋ก ํน์ ํ๋กํผํฐ๋ง ์ ์ธํ๊ณ ์ฌ์ฉํ ์ ์๋ค.
interface User { id: number; name: string; age: number; gender: "m" | "w"; } const admin: Omit<User, "age"| "gender"> = { id: 0, name: "bob", };
8. Exclude<T1,T2>
๐๐ป Exclude<T1,T2> T1 ์์ T2๋ฅผ ์ ์ธํ๊ณ ์ฌ์ฉํ๋ ๊ฒ
type T1 = string | number | boolean; type T2 = Exclude<T1, number>; // ๐ T2๋ number์ด ์ ์ธ๋๊ณ string ๊ณผ boolean๋ง ๋จ๊ฒ ๋๋ค.
9. NonNullable
๐๐ป Null ์ ์ ์ธํ ํ์ ์ ์์ฑํ๋ค.(undefined๋ ํจ๊ป ์ ์ธ ์ํจ๋ค.)
type T1 = string | null | undefined | void; type T2 = NonNullable<T1> // ๐ T2๋ string ๊ณผ void ๋ง ๋จ๊ฒ ๋๋ค.
๐ ์ฐธ๊ณ )
https://www.typescriptlang.org/docs/handbook/utility-types.html
https://www.youtube.com/watch?v=IeXZo-JXJjc&list=PLZKTXPmaJk8KhKQ_BILr1JKCJbR0EGlx0&index=8'โจ๏ธ conceptualization > Typescript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Generics ์ ๋ํ์ฌ (0) 2022.09.12 ํจ์์ ํ์ ๋ช ์ (0) 2022.09.11 Any, Union Type, Intersection Type, Type Aliases & Type Guards์ ๋ํด์ ์์๋ณด๊ธฐ (0) 2022.09.11 ์ด๊ฑฐํ(Enum) ๊ณผ ๋ฆฌํฐ๋ด ํ์ (0) 2022.09.11 ํ์ ์ผ๋ก ์ฌ์ฉ๋๋ ์ธํฐํ์ด์ค (Interface) (0) 2022.09.09 - ํ์ง๋ง