TS utility type
Partial<T>
Partial<T> ํ์ ์ ํ์ T์ ๋ชจ๋ ์์ฑ์ ์ ํ์ ์ผ๋ก ๋ง๋ค์ด์ค๋ค.
์ด๋ฅผ ํตํด ๊ธฐ์กด ํ์ ์ ์ผ๋ถ ์์ฑ๋ง ์ ๊ณตํ๋ ๊ฐ์ฒด๋ฅผ ์ฝ๊ฒ ์์ฑํ ์๊ฐ ์๋ค.
Partial<T> ์ฌ์ฉ ์ฌ๋ก
interface Person {
name: string;
age: number;
}
const updatePerson = (person: Person, fields: Partial<Person>): Person => {
return { ...person, ...fields };
};
const person: Person = { name: "Spartan", age: 30 };
const changedPerson = updatePerson(person, { age: 31 });
Person์ด๋ผ๋ ์ธํฐํ์ด์ค๋ name, age๋ผ๋ ์์ฑ์ผ๋ก ๊ตฌ์ฑ์ด ๋์ด์๋ค.
updatePerson ๋ณด๋ฉด ๋ ๋ฒ์งธ ์ธ์๋ก Partial<Person> ํ์
์ fields๋ผ๋ ์ธ์๋ฅผ ๋ฐ๋๋ค.
์ด field๋ผ๋ ์ธ์๊ฐ ๊ตฌ์ฑ์ด ๋ ์ ์๋ ๊ฒฝ์ฐ์ ์ ๋ค์์ด ์๋ค.
name์ด๋ผ๋ ์์ฑ๋ง ์์ด๋ ๋๊ณ ,
age๋ผ๋ ์์ฑ๋ง ์์ด๋ ๋๋ค.
name, age๋ผ๋ ์์ฑ์ด ๋ ๋ค ์์ด๋ ๋๋ค.
๋ค๋ง, ์ด ๋ฐ์ ์ํฉ์ ํ์ฉํ์ง ์๋๋ค.
์๋ก, {name, gender} ์ ๊ฐ์ด ๊ธฐ์กด์ ์๋ ์์ฑ์ ๋ฃ์ด์๋ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
์ด๋ ๊ฒ Partial<T> ํ์ ์ผ๋ก ์ ์ฐํ๊ฒ ํ์ ์ ์์ฑ์ ์ ํํด์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค ์๊ฐ ์๋ค.
Required<T>
Partial<T> ํ์ ๊ณผ๋ ๋ฐ๋๋ก Required<T> ํ์ ์ ํ์ T์ ๋ชจ๋ ์์ฑ์ ํ์์ ์ผ๋ก ๋ง๋ญ๋๋ค!
T ํ์ ๊ฐ์ฒด์ ์ ์๋ ๋ชจ๋ ์์ฑ์ด ๋ฐ๋์ ์ ๋ถ ์ ๊ณต์ด ๋๋ ๊ฐ์ฒด๋ฅผ ์์ฑํด์ผ ๋๋ค๋ ๋ป์ด๋ค.
Required<T> ์ฌ์ฉ ์ฌ๋ก
interface Person {
name: string;
age: number;
address?: string;
}
Person์ด๋ผ๋ ์ธํฐํ์ด์ค์ address๋ผ๋ ์์ฑ์ ์ถ๊ฐํ๋ค.
address ์ ? ๊ฐ ์๋ฏธํ๋ ๋ฐ๋ ์ ํ์ ์์ฑ์ด๋ ๋ป์ด๋ค.
์์ด๋ ๋๊ณ ์์ด๋ ๋๋ ์น๊ตฌ๋ผ๋ ๋ป.
ํ์ง๋ง, address๋ฅผ ํ์์ ์ผ๋ก ๋ฐ์์ผ ํ๋ ์ ์ฝ์ฌํญ์ด ์๋ค๊ณ ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ณ๊ฒฝ ํ ์ ์๋ค.
type RequiredPerson = Required<Person>;
์ด๋ ๊ฒ Required<T> ํ์ ์ ํตํด ์ ์ธํ๋ฉด ์ ํ ์์ฑ ๊ฐ์ธ address ์ ๋ ฅ๋ ํ์๊ฐ ๋์ผํ๋ค.
Readonly<T>
Readonly<T> ํ์ ์ ํ์ T์ ๋ชจ๋ ์์ฑ์ ์ฝ๊ธฐ ์ ์ฉ(read-only)์ผ๋ก ๋ง๋ค์ด์ค๋ค.
์ด๋ฅผ ํตํด readonly ํ์ ์ ์์ฑ๋ค๋ก ๊ตฌ์ฑ๋ ๊ฐ์ฒด๊ฐ ์๋์ด๋ ๋ถ๋ณ ๊ฐ์ฒด๋ก ์ทจ๊ธํ ์ ์๋ค.
Readonly<T> ์ฌ์ฉ ์ฌ๋ก
interface DatabaseConfig {
host: string;
readonly port: number;
}
const mutableConfig: DatabaseConfig = {
host: "localhost",
port: 3306,
};
const immutableConfig: Readonly<DatabaseConfig> = {
host: "localhost",
port: 3306,
};
mutableConfig.host = "somewhere";
immutableConfig.host = "somewhere"; // ์ค๋ฅ!
์์ ์ฝ๋์์ ์ธํฐํ์ด์ค DatabaseConfig๋ ๋ถ๋ณ ๊ฐ์ฒด๋ผ๊ณ ํ ์๊ฐ ์๋ค.
์ด์ ๋ host๊ฐ readonly๊ฐ ์๋๊ธฐ ๋๋ฌธ์ด๋ค.
host์๋ readonly๋ฅผ ์ ์ฉ์ํจ๋ค๋ฉด ๋ถ๋ณ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด๋ผ ์ ์๋ค.
Pick<T, K>
Pick<T, K> ์ ํธ๋ฆฌํฐ ํ์ ์ ํ์ T์์ K ์์ฑ๋ค๋ง ์ ํํ์ฌ ์๋ก์ด ํ์ ์ ๋ง๋ญ๋๋ค!
์ด๋ฅผ ํตํด ํ์ ์ ์ผ๋ถ ์์ฑ๋ง์ ํฌํจํ๋ ๊ฐ์ฒด๋ฅผ ์ฝ๊ฒ ์์ฑํ ์๊ฐ ์๋ค.
Pick<T, K> ์ฌ์ฉ ์ฌ๋ก
interface Person {
name: string;
age: number;
address: string;
}
type SubsetPerson = Pick<Person, "name" | "age">;
const person: SubsetPerson = { name: "Spartan", age: 30 };
SubsetPerson์ Person์ด๋ผ๋ ์ธํฐํ์ด์ค์์ name, age ์์ฑ๋ง ์ ํํด์ ๊ตฌ์ฑ๋ ์๋ก์ด ํ์
์ด๋ค.
์ด๋ฐ์์ผ๋ก ์ํ๋ ์์ฑ๊ฐ์ pick ํด์ ์๋ก์ด ํ์
์ ์ง์ ํ ์ ์๋ค.
Omit<T, K>
Omit<T, K> ์ ํธ๋ฆฌํฐ ํ์ ์ ํ์ T์์ K ์์ฑ๋ค๋ง ์ ์ธํ ์๋ก์ด ํ์ ์ ๋ง๋ ๋ค.
Pick<T, K> ์ ํธ๋ฆฌํฐ ํ์ ๊ณผ๋ ๋์์ด ๋ฐ๋!!
์ด๋ฅผ ํตํด ๊ธฐ์กด ํ์ ์์ ํน์ ์์ฑ์ ์ ๊ฑฐํ ์๋ก์ด ํ์ ์์ฑ์ด ๊ฐ๋ฅํ๋ค.
Omit<T, K> ์ฌ์ฉ ์ฌ๋ก
interface Person {
name: string;
age: number;
address: string;
}
type SubsetPerson = Omit<Person, "address">;
const person: SubsetPerson = { name: "Alice", age: 30 };
์ฌ๊ธฐ์ SubsetPerson ํ์ ์ Person ํ์ ์์ address ์์ฑ๋ง ์ ์ธํ ์๋ก์ด ํ์ ์ ๋๋ค!
์์ ์ ํ๋ฉด์ pick ๊ณผ partial, read only ๋๋ฌด๋๋ ๋ง์ด ์ฌ์ฉํ๊ณ ๋ณด์ด๊ธฐ ๋๋ฌธ์ ์ ๋ฆฌ๋ฅผ ํด๋ณธ๋ค.
#ts #utilitytype #partial #pick #readonly #omit #required
'TS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[TS] : ์ ๊ทผ ์ ํ์ (0) | 2023.08.22 |
---|---|
[TS] : any unknown union (0) | 2023.08.21 |
[TS] : tuple enum (0) | 2023.08.18 |
[TS] : .d.ts (0) | 2023.08.17 |
[TS] : tsconfig.json (0) | 2023.08.17 |