[TS] TypeScript ํ์ ์คํฌ๋ฆฝํธ satisfies ์ฐ์ฐ์
ํ์
์คํฌ๋ฆฝํธ 4.9 ๋ฒ์ ๋ถํฐ ์์ ํ *์
์บ์คํ
์ ์ง์ํ๋ satisfies
์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค. satisfies
์ฐ์ฐ์๋ฅผ ํ์ฉํ๋ฉด ํ์
์ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ ๋ณ์์ *์ ์ฝ ์กฐ๊ฑด(constraint)์ ์ ์ฉํ ์ ์๋ค. ์ฆ, ๊ฐ์ฒด ํ๋กํผํฐ์ ์ ์ฝ ์กฐ๊ฑด์ ์ ์ฉํ๋ฉด์ ๊ฐ ํ๋กํผํฐ์ ํ์
์ ์ฌ๋ฐ๋ฅด๊ฒ ์ถ๋ก ํ ์ ์๋ค.
๐ก ์ฉ์ด ์ค๋ช
- ์บ์คํ : ํ์ ๋ณํ
- ์ ์บ์คํ : ์์ ํด๋์ค๋ฅผ ๋ถ๋ชจ ํด๋์ค ํ์ ์ผ๋ก ์บ์คํ (์์ ํ์ ์ผ๋ก ๋ณํ)
- ๋ค์ด์บ์คํ : ๋ถ๋ชจ ํด๋์ค๋ฅผ ์์ ํด๋์ค ํ์ ์ผ๋ก ์บ์คํ (ํ์ ํ์ ์ผ๋ก ๋ณํ)
- ์ ์ฝ ์กฐ๊ฑด : ํน์ ํ์ ์ด๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ ํ์ฌ ์ฝ๋์ ์์ ์ฑ๊ณผ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๋ ๋ฐฉ๋ฒ
๋ฌธ์
์๋ ์ฐธ๊ฐ์ ์ ๋ณด๋ฅผ ๋ํ๋ด๋ attendee
๊ฐ์ฒด๊ฐ ์๋ค. ๊ฐ์ฒด๋ฅผ ์ ์ธํ๋ฉด ํ์
์คํฌ๋ฆฝํธ๋ ๊ฐ์ฒด์ ๊ฐ ํ๋กํผํฐ ํ์
์ ์๋์ผ๋ก ์ถ๋ก ํ๋ค.
๊ทธ๋์ attendee.age
(number
ํ์
์ผ๋ก ์ถ๋ก )์ ์ซ์๋ฅผ ๋ํ๊ฑฐ๋ attendee.name
(string
ํ์
์ผ๋ก ์ถ๋ก )์ toUpperCase
๊ฐ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ํ์ง๋ง attendee
๊ฐ์ฒด๊ฐ ์ด๋ค ํ๋กํผํฐ๋ก ๊ตฌ์ฑ๋ผ ์๋์ง ๊ตฌ์ฒด์ ์ผ๋ก ๋ช
์ํ์ง ์์์(์ ์ฝ ์กฐ๊ฑด ์์) posittion
๊ฐ์ ์คํ๊ฐ ์๊ฒจ๋ ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
// attendee: { name: string; age: number; posittion: string; }
const attendee = {
name: 'Smith',
age: 30,
posittion: 'Engineer', // ์คํ
};
const plusAge = attendee.age + 10; // OK (number ํ์
์ผ๋ก ์ถ๋ก )
const nameToUpperCase = attendee.name.toUpperCase(); // OK (string ํ์
์ผ๋ก ์ถ๋ก )
ํ์
์ด๋
ธํ
์ด์
(ํ์
ํ๊ธฐ)์ ์ฌ์ฉํ๋ฉด ์ ๊ฐ์ ์คํ๋ฅผ ์ฌ์ ์ ๋ฐฉ์งํ ์ ์๋ค. ํ์ง๋ง ๊ฐ์ฒด์ ๊ฐ ํ๋กํผํฐ๊ฐ ์ด๋ค ํ์
์ ๊ฐ์ง๋์ง์ ๋ํ ์ ๋ณด๋ฅผ ์๊ฒ ๋๋ค. ๊ฒฐ๊ตญ attendee
๊ฐ์ฒด์ ๋ชจ๋ ํ๋กํผํฐ๋ string | number
์ ๋์จ ํ์
์ ๊ฐ๊ฒ ๋๋ค.
type Attendee = 'name' | 'age' | 'position';
const attendee: Record<Attendee, string | number> = {
name: 'Smith',
age: 30,
posittion: 'Engineer', // Error! ์คํ ๊ฐ์ง
};
const plusAge = attendee.age + 10; // Error! ts(2365)
const nameToUpperCase = attendee.name.toUpperCase(); // Error! ts(2339)
๋๋ฌธ์ attendee.age
์ 10์ ๋ํ๋ฉด string | number
ํ์
์ +
์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค๊ณ ๋์จ๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก attendee.name
์ toUpperCase
๋ฅผ ์ฌ์ฉํ๋ฉด string | number
ํ์
์ toUpperCase
์์ฑ์ด ์๋ค๋ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
ํด๊ฒฐ
์ ๊ฐ์ ๋ฌธ์ ๋ satisfies
์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ฉด ํด๊ฒฐํ ์ ์๋ค. ๊ทธ๋ผ attendee
๊ฐ์ฒด ํ๋กํผํฐ๋ฅผ Attendee
ํ์
์ผ๋ก ์ ํํ๋ฉด์(์ ์ฝ ์กฐ๊ฑด ์ ์ฉ), ๊ฐ ํ๋กํผํฐ์ ํ์
์ ์ฌ๋ฐ๋ฅด๊ฒ ์ถ๋ก ํ ์ ์๋ค.
type Attendee = 'name' | 'age' | 'position';
const attendee = {
name: 'Smith',
age: 30,
posittion: 'Engineer', // Error! ์คํ ๊ฐ์ง
} satisfies Record<Attendee, string | number>;
const plusAge = attendee.age + 10; // OK (number ํ์
์ผ๋ก ์ถ๋ก )
const nameToUpperCase = attendee.name.toUpperCase(); // OK (string ํ์
์ผ๋ก ์ถ๋ก )
์์ — unknown
unknown
ํค์๋๋ฅผ ์ฌ์ฉํ์ ๋๋ ํ๋กํผํฐ ํ์
์ ์ฌ๋ฐ๋ฅด๊ฒ ์ถ๋ก ํ๋ค. satisfies
์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด ๊ฐ ํ๋กํผํฐ ๊ฐ์ ์ฌ์ฉํ ๋๋ง๋ค ํ์
๋จ์ธ/๊ฐ๋ ์์
์ ํด์ค์ผ ํ๋ค.
type Attendee = 'name' | 'age' | 'position';
const attendee = {
name: 'Smith',
age: 30,
posittion: 'Engineer', // Error! ์คํ ์บ์น
} satisfies Record<Attendee, unknown>;
const plusAge = attendee.age + 10; // OK
const nameToUpperCase = attendee.name.toUpperCase(); // OK
์์ — ํํ
ํ๋กํผํฐ ๊ฐ์ด ํํ(๋ฐฐ์ด ๊ฐ ์์์ ํ์
์ด ์ด๋ฏธ ์ ํด์ ธ ์๋ ํ์)์ผ ๋๋ ์ ์๋ํ๋ค. ์๋ ์์์์ RGB
ํ์
์ [number, number, number]
์ง๋ง, blue
ํ๋กํผํฐ์ ๊ฐ์ [number, number]
ํ์
์ด๋ฏ๋ก ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
// ์ฝ๋ ์ฐธ๊ณ via ๊ณต์ ๋ฌธ์
type RGB = [red: number, green: number, blue: number];
const palette = {
red: [255, 0, 0],
green: '#00ff00',
blue: [0, 0], // Error! ts(2322)
} satisfies Record<string, string | RGB>;
const redComponent = palette.red.at(0); // OK
const greenNormalized = palette.green.toUpperCase(); // OK
์์ — as const ํค์๋์ ํจ๊ป ์ฌ์ฉํ๊ธฐ
satisfies
์ฐ์ฐ์๋ as const
ํค์๋์ ํจ๊ป ์ฌ์ฉํ ์ ์๋ค. as const
ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ์ฒด์ ๋ชจ๋ ํ๋กํผํฐ๊ฐ readonly
๋ก ๋ณ๊ฒฝ๋๊ณ ํ ๋น๋ ๋ฆฌํฐ๋ด ๊ฐ(์์ค ์ฝ๋์ ์ง์ ์
๋ ฅํ ๊ณ ์ ๋ ๊ฐ)์ผ๋ก ํ๋กํผํฐ ํ์
์ ์ถ๋ก ํ๋ค. ๋ฐ๋ผ์ palette
๊ฐ์ฒด ํ๋กํผํฐ ๊ฐ์ ์ ์ฉํ RGB
ํ์
์๋ readonly
ํค์๋๋ฅผ ๋ถ์ฌ์ค์ผ ํ๋ค.
type RGB = readonly [red: number, green: number, blue: number];
const palette = {
red: [255, 0, 0],
green: '#00ff00',
blue: [0, 0, 0],
} as const satisfies Record<string, string | RGB>;
์์ — as Type vs satisfies ๋น๊ต
type Action = {
label: string;
onClick?: () => void;
color?: 'primary';
variant?: 'outlined' | 'contained';
};
const actions = [
{ label: 'No', onClick: closeModal, variant: 'outlined' },
{ label: 'Yes', onClick: onConfirm, variant: 'contained' },
] satisfies Action[];
as Action[]
ํ์ ๋จ์ธ์ ์ฌ์ฉํ๋ฉด ํ๋กํผํฐ ์ด๋ฆ์ ์คํ(variants
๋ฑ)๊ฐ ์์ด๋ ์ก์๋ด์ง ๋ชปํ๋ค- ํ์
๋จ์ธ์ ์ฌ์ฉํ์ง ์์ ๊ฒฝ์ฐ
variant
ํ๋กํผํฐ ๊ฐ ํ์ ์ ํญ์string
์ผ๋ก ์ถ๋ก ํ๋ค satisfies
๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋กํผํฐ ์ด๋ฆ์ ์คํ๋ฅผ ์ก์๋ด๊ณ , ๊ฐ ํ๋กํผํฐ ๊ฐ์ ํ์ ์ ๋ณด๋ ์ ์งํ ์ ์๋ค
๋ ํผ๋ฐ์ค
- [๋ฒ์ญ] TypeScript 4.9
- TypeScript 4.9 'satisfies' operator to ensure expression matches some type
- satisfies: ์์ ํ ์ ์บ์คํ (TypeScript 4.9) | GeekNews
- TypeScript 4.9: satisfies operator
๊ธ ์์ ์ฌํญ์ ๋ ธ์ ํ์ด์ง์ ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ๋ฐ์๋ฉ๋๋ค. ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์
'๐ช Programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[TS] ํ์ ์คํฌ๋ฆฝํธ์ ๊ณต๋ณ์ฑ / ๋ฐ๊ณต๋ณ์ฑ / ์ด๋ณ์ฑ (0) | 2024.05.17 |
---|---|
[React] ๋ฆฌ์กํธ์์ Rendering ๋ ๋๋ง์ด๋? (0) | 2024.05.16 |
[React/JS] Promise ํ๋ก๋ฏธ์ค๋ฅผ ํ์ฉํ UX ๊ฐ์ โ ํด ๋ฏธ๋ฃจ๊ธฐ (0) | 2024.05.16 |
[React] ๋ฆฌ์กํธ Profiler ํ๋กํ์ผ๋ฌ์ Hook ์์ (0) | 2024.05.16 |
[DevTools] iPhone ์์ดํฐ ์ฌํ๋ฆฌ์์ ๋๋ฒ๊น / ์ฝ์ ์ฌ์ฉํ๊ธฐ (0) | 2024.05.16 |
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
[TS] ํ์ ์คํฌ๋ฆฝํธ์ ๊ณต๋ณ์ฑ / ๋ฐ๊ณต๋ณ์ฑ / ์ด๋ณ์ฑ
[TS] ํ์ ์คํฌ๋ฆฝํธ์ ๊ณต๋ณ์ฑ / ๋ฐ๊ณต๋ณ์ฑ / ์ด๋ณ์ฑ
2024.05.17 -
[React] ๋ฆฌ์กํธ์์ Rendering ๋ ๋๋ง์ด๋?
[React] ๋ฆฌ์กํธ์์ Rendering ๋ ๋๋ง์ด๋?
2024.05.16 -
[React/JS] Promise ํ๋ก๋ฏธ์ค๋ฅผ ํ์ฉํ UX ๊ฐ์ — ํด ๋ฏธ๋ฃจ๊ธฐ
[React/JS] Promise ํ๋ก๋ฏธ์ค๋ฅผ ํ์ฉํ UX ๊ฐ์ — ํด ๋ฏธ๋ฃจ๊ธฐ
2024.05.16 -
[React] ๋ฆฌ์กํธ Profiler ํ๋กํ์ผ๋ฌ์ Hook ์์
[React] ๋ฆฌ์กํธ Profiler ํ๋กํ์ผ๋ฌ์ Hook ์์
2024.05.16