๐Ÿ‘ฉ‍๐ŸŽค ํ”„๋ก ํŠธ์—”๋“œ/typescript

    [typescript] ๋™์ ์œผ๋กœ ํ‚ค๊ฐ€ ์ถ”๊ฐ€๋˜๋Š” ๊ฐ์ฒด์˜ ํƒ€์ž… ์ง€์ •ํ•˜๊ธฐ

    const cache = {}; const add = (id: string, value: string) => { cache[id] = value; }; const remove = (id: string) => { delete cache[id]; }; cache ๊ฐ์ฒด์—๋Š” ๋™์ ์œผ๋กœ ํ‚ค๊ฐ€ ์ถ”๊ฐ€๋˜๊ณ , ์‚ญ์ œ๋  ์ˆ˜ ์žˆ๋‹ค. 1. Record ์‚ฌ์šฉํ•˜๊ธฐ const cache: Record = {} Record์˜ ์ฒซ๋ฒˆ์งธ ์ธ์ˆ˜์—๋Š” key์˜ ํƒ€์ž…, ๋‘๋ฒˆ์งธ์—๋Š” value์˜ ํƒ€์ž…์„ ์ง€์ •ํ•œ๋‹ค. Record ๊ฐ์ฒด์˜ ํ‚ค๊ฐ€ Keys, ๊ฐ’์€ Type์— ์ง€์ •ํ•˜์—ฌ ๊ฐ์ฒด ํƒ€์ž…์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. 2. index ํƒ€์ž… ์ง€์ • const cache: { [id: string]: string } = {}; ์ธํ„ฐํŽ˜์ด์Šค ๋˜๋Š” ํƒ€์ž… ์‚ฌ์šฉ interface C..

    TS2339: Property 'reset' does not exist on type 'EventTarget'.

    form ์š”์†Œ์˜ reset ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€๋ฐ ์•„๋ž˜์™€ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. const handleFormSubmit = async (e: React.FormEvent) => { ... e.target.reset(); // TS2339: Property 'reset' does not exist on type 'EventTarget'. } TS2339: Property 'reset' does not exist on type 'EventTarget'. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• 1. ํƒ€์ž… ๋‹จ์–ธํ•˜๊ธฐ e.target์— as๋ฅผ ์‚ฌ์šฉํ•ด์„œ HTMLFormElement ํƒ€์ž…์„ ๋‹จ์–ธํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค. (e.target as HTMLFormElement).reset(); const handleFormSubmit = async (e: R..

    Property 'Authorization' does not exist on type 'AxiosHeaders'

    ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์—์„œ jwt๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— axios interceptor๋ฅผ ์ด์šฉํ•ด์„œ ํ† ํฐ์— ๋”ฐ๋ผ request ํ—ค๋” ์„ค์ •์„ ํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด interceptor๋ฅผ ์„ค์ •ํ•˜์˜€๋‹ค. axios.interceptors.request.use((request) => { request.headers ? (request.headers.Authorization = `Bearer ${token}`) : (request.headers = { Authorization: `Bearer ${token}` }); }); // ๋˜๋Š” axios.interceptors.request.use((request) => { if (request.headers) { request.headers.Authorization = `Be..