ํ์ ์คํฌ๋ฆฝํธ ํ๋ณํ์ ๋ชจ๋ ๊ฒ: ์๋ฒฝ ์ ๋ณต ๊ฐ์ด๋
ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ๋ค ๋ณด๋ฉด ์ปดํ์ผ๋ฌ๊ฐ ํ์ ์ ์ ๋๋ก ์ถ๋ก ํ์ง ๋ชปํ๊ฑฐ๋, ๊ฐ๋ฐ์๊ฐ ๋ ์ ํํ ํ์ ์ ์๊ณ ์์ ๋๊ฐ ์์ต๋๋ค. DHH(David Heinemeier Hansson)๊ฐ hotwired/turbo ํ๋ก์ ํธ์์ ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ ๊ฑฐํ๋ฉด์ "ํ์ ์คํฌ๋ฆฝํธ๊ฐ ์ ๋ง ํ์ํ๊ฐ?"์ ๋ํ ๋ ผ์์ด ๋ค์ ๋ถ๋ถ๊ธฐ๋ ํ์ฃ . ํ์ง๋ง ๋๊ท๋ชจ ํ๋ก์ ํธ์์ ํ์ ์คํฌ๋ฆฝํธ์ ์ ์ ํ์ ์์คํ ์ด ์ฃผ๋ ์์ ์ฑ์ ์ฌ์ ํ ๋งค๋ ฅ์ ์ ๋๋ค.
์ด๋ฌํ ํ์ ์์คํ ์ ๋ ์ ์ฐํ๊ณ ๊ฐ๋ ฅํ๊ฒ ์ฌ์ฉํ๋ ค๋ฉด โํ๋ณํ(Type Casting)โ ๋๋ 'ํ์ ๋จ์ธ(Type Assertion)'์ ๋ํ ์ดํด๊ฐ ํ์์ ์ ๋๋ค. ์ด ๊ธ์์๋ ํ์ ์คํฌ๋ฆฝํธ์ ๋ค์ํ ํ๋ณํ ๋ฐฉ๋ฒ์ ์์๋ณด๊ณ , ๊ฐ ์ํฉ์ ๋ง๋ ์ต์ ์ ๋ฐฉ๋ฒ์ ์ ํํ๋ ๊ธฐ์ค์ ์ ์ํด ๋๋ฆฝ๋๋ค.
๋จผ์ ์ค์ํ ์ ์ ์ง๊ณ ๋์ด๊ฐ๊ฒ ์ต๋๋ค. ํ์ ์คํฌ๋ฆฝํธ์ ํ๋ณํ์ ๋ฐํ์์ ๊ฐ์ ์ค์ ํํ๋ฅผ ๋ฐ๊พธ๋ ๊ฒ์ด ์๋๋๋ค. ์ค์ง ์ปดํ์ผ ํ์์ ํ์ ๊ฒ์ฌ๊ธฐ์๊ฒ "์ด ๊ฐ์ ๋ด๊ฐ ๋ช ์ํ๋ ์ด ํ์ ์ผ๋ก ๊ฐ์ฃผํด ์ค"๋ผ๊ณ ์๋ ค์ฃผ๋ ํ์์ ๋๋ค. ๋ฐํ์ ์ฝ๋์๋ ์๋ฌด๋ฐ ์ํฅ์ ์ฃผ์ง ์์ฃ .
as: ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ํ์
๋จ์ธ
as ํค์๋๋ ํ์
์คํฌ๋ฆฝํธ์์ ๊ฐ์ฅ ํํ๊ฒ ์ฌ์ฉ๋๋ ํ์
๋จ์ธ ๋ฌธ๋ฒ์
๋๋ค. ๊ฐ๋ฐ์๊ฐ ์ปดํ์ผ๋ฌ๋ณด๋ค ํ์
์ ๋ ์ ์๊ณ ์์ ๋ ํ์ ์ ๊ฐ์ง๊ณ ํ์
์ ์ง์ ํด ์ค ์ ์์ต๋๋ค. ํนํ any๋ unknown์ฒ๋ผ ํ์
์ ๋ณด๊ฐ ์๋ ๊ฐ์ ๊ตฌ์ฒด์ ์ธ ํ์
์ผ๋ก ๋ค๋ฃฐ ๋ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋ฉ๋๋ค.
interface Hero {
name: string;
age: number;
}
const capt = {} as Hero; // ๋น ๊ฐ์ฒด๋ฅผ Hero ํ์
์ผ๋ก ๋จ์ธ
capt.name = '์บกํด';
capt.age = 100;
์ฐธ๊ณ ๋ก, JSX(TSX)์ ํจ๊ป ์ฌ์ฉํ ๋๋ ๊บพ์ ๊ดํธ(<Type>) ๋ฌธ๋ฒ์ด JSX ํ๊ทธ์ ํผ๋๋ ์ ์์ผ๋ฏ๋ก, as ํค์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ํ์ค์ฒ๋ผ ๊ตณ์ด์ก์ต๋๋ค. ๊ผญ ๊ธฐ์ตํด๋์ธ์!
as const: ๊ฐ์ ๋ฆฌํฐ๋ด ํ์
์ผ๋ก ๊ณ ์ ํ๊ธฐ
as const๋ ๋ณ์๋ ๊ฐ์ฒด๋ฅผ ๋ง์น const๋ก ์ ์ธํ ๊ฒ์ฒ๋ผ ๋ง๋ค์ด, ๋ชจ๋ ํ๋กํผํฐ๋ฅผ readonly๋ก ๋ฐ๊พธ๊ณ ๊ฐ์ ์์ฃผ ๊ตฌ์ฒด์ ์ธ ๋ฆฌํฐ๋ด ํ์
์ผ๋ก ๊ณ ์ ํฉ๋๋ค.
// ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ, 'direction'์ ํ์
์ 'string'์ผ๋ก ์ถ๋ก ๋ฉ๋๋ค.
let direction = "left";
// 'as const'๋ฅผ ์ฌ์ฉํ๋ฉด ํ์
์ด "left"๋ผ๋ ๋ฆฌํฐ๋ด ํ์
์ผ๋ก ๊ณ ์ ๋ฉ๋๋ค.
const directionConst = "left" as const;
// directionConst์ ํ์
: "left"
const config = {
method: "GET",
cache: false,
} as const;
/*
config์ ํ์
:
{
readonly method: "GET";
readonly cache: false;
}
*/
์ด๋ ๊ฒ ํ๋ฉด ๊ฐ์ฒด์ ํ๋กํผํฐ๊ฐ ์ค์๋ก ๋ณ๊ฒฝ๋๋ ๊ฒ์ ๋ง์ ์ ์๊ณ , ํน์ ๋ฌธ์์ด ๊ฐ๋ง ํ์ฉํ๋ ํจ์์ ์ธ์๋ก ๋๊ธธ ๋ ํ์ ์์ ์ฑ์ ๋์ผ ์ ์์ต๋๋ค.
!: Non-null ๋จ์ธ ์ฐ์ฐ์
! ์ฐ์ฐ์๋ ํน์ ๊ฐ์ด null์ด๋ undefined๊ฐ ์ ๋ ์๋๋ผ๊ณ ์ปดํ์ผ๋ฌ์๊ฒ ๊ฐํ๊ฒ ์ฃผ์ฅํ ๋ ์ฌ์ฉํฉ๋๋ค. DOM ์์์ ์ ๊ทผํ ๋์ฒ๋ผ, ๊ฐ๋ฐ์๋ ํด๋น ์์๊ฐ ๋ฐ๋์ ์กด์ฌํ๋ค๊ณ ํ์ ํ๋ ์ํฉ์์ ์ ์ฉํฉ๋๋ค.
// ์ปดํ์ผ๋ฌ๋ querySelector๊ฐ null์ ๋ฐํํ ์ ์๋ค๊ณ ๊ฒฝ๊ณ ํฉ๋๋ค.
const el = document.querySelector("input")!; // '!'๋ก null์ด ์๋์ ๋จ์ธ
el.focus(); // ์ด์ el์ด null์ด ์๋๋ผ๊ณ ๊ฐ์ฃผํ๋ฏ๋ก ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค.
ํ์ง๋ง ์ด ๋ฐฉ๋ฒ์ ์ ์คํ๊ฒ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ๋ง์ฝ ๋ฐํ์์ ์ค์ ๋ก ๊ฐ์ด null์ด๋ผ๋ฉด, ์ฝ๋๋ ์๋ฌ๋ฅผ ๋ฐ์์ํค๋ฉฐ ๋ฉ์ถ๊ฒ ๋ฉ๋๋ค. !๋ ์ปดํ์ผ๋ฌ์ ์ ์ฉํ ๊ฒฝ๊ณ ๋ฅผ ๋ฌด์ํ๋ ํ์์ด๋ฏ๋ก, ์ ๋ง 100% ํ์ ํ ์ ์๋ ์ํฉ์์๋ง ์ ํ์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
satisfies: ํ์
์ ์งํค๊ณ ์ถ๋ก ์ ์ด๋ฆฌ๊ณ
ES2022์ ๋์
๋ satisfies ์ฐ์ฐ์๋ as์ ๋จ์ ์ ๋ณด์ํ๋ ์์ฃผ ๋๋ํ ๋ฐฉ๋ฒ์
๋๋ค. ์ด๋ค ๊ฐ์ด ํน์ ํ์
์ "๋ง์กฑ(satisfy)"ํ๋์ง ๊ฒ์ฌํ๋ฉด์๋, ๊ฐ ์์ฒด์ ๊ตฌ์ฒด์ ์ธ ๋ฆฌํฐ๋ด ํ์
์ถ๋ก ์ ๊ทธ๋๋ก ์ ์งํด ์ค๋๋ค.
as๋ฅผ ์ฌ์ฉํ๋ฉด ํ์
์ด ๊ฐ์ ๋ก ๊ณ ์ ๋์ด ์๋์ ๊ตฌ์ฒด์ ์ธ ํ์
์ ๋ณด๋ฅผ ์๊ฒ ๋ ์ ์์ต๋๋ค. ํ์ง๋ง satisfies๋ ํ์
๊ฒ์ฌ๋ฅผ ํต๊ณผ์ํค๋ฉด์๋ ํ์
์ถ๋ก ์ ์ด์ ์ ๋ชจ๋ ๋๋ฆฌ๊ฒ ํด์ค๋๋ค.
type Config = { method: "GET" | "POST"; url: string };
// 'as'๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ
const apiConfigAs = {
method: "GET",
url: "/users",
} as Config;
// apiConfigAs.method์ ํ์
์ "GET" | "POST"์ผ๋ก ํ์ฅ๋ฉ๋๋ค.
// 'satisfies'๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ
const apiConfigSatisfies = {
method: "GET",
url: "/users",
} satisfies Config;
// apiConfigSatisfies.method์ ํ์
์ "GET" ๋ฆฌํฐ๋ด ํ์
์ผ๋ก ์ ์ง๋ฉ๋๋ค!
๋ง์ฝ ๊ฐ์ฒด์ Config ํ์
์ ์๋ ํ๋กํผํฐ๋ฅผ ์ถ๊ฐํ๋ฉด satisfies๋ ์ปดํ์ผ ์๋ฌ๋ฅผ ๋ฐ์์์ผ ์ค์๋ฅผ ๋ง์์ค๋๋ค. ์ด์ฒ๋ผ ํ์
๊ฒ์ฌ์ ํ์
์ถ๋ก ์ ์ฅ์ ์ ๋ชจ๋ ์ทจํ๊ณ ์ถ์ ๋ satisfies๋ ์ต๊ณ ์ ์ ํ์ด ๋ ์ ์์ต๋๋ค.
์ด์ค ๋จ์ธ (Double Assertion)
์๋ก ๊ด๋ จ ์๋ ํ์
๋ผ๋ฆฌ๋ ์ง์ ํ๋ณํ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค. ์ด๋ด ๋ unknown (๋๋ any)์ ์ค๊ฐ ๋ค๋ฆฌ๋ก ์ฌ์ฉํ๋ โ์ด์ค ๋จ์ธโ ๊ธฐ๋ฒ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
const value: string = "123";
// ์ค๋ฅ: string ํ์
์ number ํ์
์ผ๋ก ์ง์ ๋ณํํ ์ ์์ต๋๋ค.
// const num = value as number;
// ์ด์ค ๋จ์ธ: string -> unknown -> number
const num = value as unknown as number; // ์ํํ์ง๋ง, ์ปดํ์ผ๋ฌ๋ฅผ ํต๊ณผํฉ๋๋ค.
์ด ๋ฐฉ๋ฒ์ ํ์ ๊ฒ์ฌ๊ธฐ๋ฅผ ์์ ํ ์ฐํํ๋ ๊ฒ์ด๋ฏ๋ก ๋งค์ฐ ์ํํฉ๋๋ค. ์ฝ๋๊ฐ ์ค์ ๋ก ๋ฌด์์ ํ๋์ง ์ ํํ ์๊ณ ์์ผ๋ฉฐ, ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ์์ ๋ ์ตํ์ ์๋จ์ผ๋ก๋ง ์ฌ์ฉํด์ผ ํฉ๋๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ฌ์ฉ์ ์ ์ ํ์ ๊ฐ๋(์๋์์ ์ค๋ช ) ๋ฑ์ผ๋ก ๋ ์์ ํ๊ฒ ํด๊ฒฐํ ์ ์์ต๋๋ค.
is: ์ฌ์ฉ์ ์ ์ ํ์
๊ฐ๋๋ก ํ์
์ขํ๊ธฐ
์กฐ๊ฑด๋ฌธ์ ์ฌ์ฉํด ํ์
์ ์ขํ๋ ๊ฒ์ 'ํ์
๊ฐ๋(Type Guard)'๋ผ๊ณ ํฉ๋๋ค. typeof, instanceof ๋ฑ์ด ๋ํ์ ์ด์ฃ . ์ฌ๊ธฐ์ ๋ ๋์๊ฐ is ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ์ฉ์ ์ ์ ํ์
๊ฐ๋ ํจ์๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ๋ณต์กํ ๊ฐ์ฒด์ ํ์
์ ํ๋ณํ๋ ๋ก์ง์ ํจ์๋ก ๋ถ๋ฆฌํ์ฌ ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ๊ณผ ๊ฐ๋
์ฑ์ ๋์ผ ์ ์์ต๋๋ค.
// 'value is string'์ ์ด ํจ์๊ฐ true๋ฅผ ๋ฐํํ๋ฉด value์ ํ์
์ด string์์ ๋ณด์ฅํ๋ค๋ ์๋ฏธ์
๋๋ค.
function isString(value: unknown): value is string {
return typeof value === "string";
}
function print(value: unknown) {
if (isString(value)) {
// ์ด ๋ธ๋ก ์์์ value๋ string ํ์
์ผ๋ก ์์ ํ๊ฒ ์ทจ๊ธ๋ฉ๋๋ค.
console.log(value.toUpperCase());
}
}
์ด์ฒ๋ผ is๋ฅผ ํ์ฉํ๋ฉด ๋ณต์กํ ์กฐ๊ฑด๋ถ ํ์
๋ก์ง์ ๋ช
ํํ๊ณ ์์ ํ๊ฒ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
๋ ๋์ ์ฝ๋๋ฅผ ์ํ ์ ์ธ
ํ์ ์คํฌ๋ฆฝํธ์ ํ๋ณํ์ ๊ฐ๋ ฅํ ๋๊ตฌ์ด์ง๋ง, ๋จ์ฉํ๋ฉด ํ์ ์์คํ ์ ์ฅ์ ์ ๋ฌด๋๋จ๋ฆด ์ ์์ต๋๋ค. "๋๋ ์ปดํ์ผ๋ฌ๋ณด๋ค ๋๋ํ๋ค"๋ ์์ ๊ฐ์ด ํ์ํ ๋๋ ์์ง๋ง, ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ปดํ์ผ๋ฌ์ ๊ฒฝ๊ณ ์๋ ์ด์ ๊ฐ ์์ต๋๋ค.
ํ๋ณํ์ ์ฌ์ฉํ๊ธฐ ์ ์ ๋ค์์ ๋จผ์ ๊ณ ๋ คํด ๋ณด์ธ์.
- ํ์
๊ฐ๋(
typeof,instanceof,in๋๋ ์ฌ์ฉ์ ์ ์isํจ์)๋ก ํ์ ์ ์์ ํ๊ฒ ์ขํ ์ ์๋๊ฐ? satisfies์ฐ์ฐ์๋ฅผ ํตํด ํ์ ๊ฒ์ฌ์ ํ์ ์ถ๋ก ์ ๋ชจ๋ ๋ง์กฑ์ํฌ ์๋ ์๋๊ฐ?- ์ ๋ค๋ฆญ(Generic)์ ์ฌ์ฉํด ๋ ์ ์ฐํ ํ์ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค ์๋ ์๋๊ฐ?
์ด๋ฌํ ๊ณ ๋ฏผ์ ๊ฑฐ์น ํ์๋ ์ฌ์ ํ ํ๋ณํ์ด ํ์ํ๋ค๋ฉด, ๊ทธ ์๋ฏธ์ ์ ์ฌ์ ์ํ์ ์ ํํ ์ดํดํ๊ณ ์ฌ์ฉํ์๊ธธ ๋ฐ๋๋๋ค ! ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉ๋ ํ์ ๋จ์ธ์ ์ฌ๋ฌ๋ถ์ ํ์ ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ํ ๋จ๊ณ ๋ ๋์ ์์ค์ผ๋ก ์ด๋์ด ์ค ๊ฒ์ ๋๋ค.
ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉ ํ๋๋ฐ์ ๋ ๊ฐ์ง ๋ช ์ธ์ด ์์ต๋๋ค.
any๋ฅผ ์ฌ์ฉํ์ง ๋ง ๊ฒ.- ํ์ ๋จ์ธ์ ์ฌ์ฉํ์ง ๋ง๊ฒ.
๊ทธ๋ ์ง๋ง ์ ๋ง ํ์คํ ๋์ ํ์ ๋จ์ธ์ ์ฌ์ฉํ๋ ๊ฒ์ ์ฝ๋ ์์ฑ์ ํจ์ฌ ๋น ๋ฅด๊ฒ ๋จ์ถ์ํฌ ์ ์์ฃ !