Skip to content

Latest commit

ย 

History

History
149 lines (100 loc) ยท 4.34 KB

File metadata and controls

149 lines (100 loc) ยท 4.34 KB

ํ•ด๋‹น ๋ฌธ์„œ๋Š” type-challenges ์— ๊ด€๋ จํ•œ ๋‚ด์šฉ์„ ๋‹ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

easy

14

18

43

189

14๋ฒˆ

๋ฌธ์ œ: ๋ฐฐ์—ด(ํŠœํ”Œ) T๋ฅผ ๋ฐ›์•„ ์ฒซ ์›์†Œ์˜ ํƒ€์ž…์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ œ๋„ค๋ฆญ First๋ฅผ ๊ตฌํ˜„ํ•˜์„ธ์š”.

๋‹ต์•ˆ:

type First<T extends any[]> = T extends [] ? never : T[0];

First๋ผ๋Š” ํƒ€์ž…์€ ๋ฐฐ์—ด์˜ ํ˜•ํƒœ์ด๊ฑฐ๋‚˜ ๋ฐฐ์—ด๊ณผ ์œ ์‚ฌํ•œ ํ˜•ํƒœ๋ฅผ ๋ฐ›์„ ์ œ๋„ˆ๋ฆญ T๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.

์‚ผํ•ญ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•ด T๊ฐ€ ๋น„์—ˆ์„ ๊ฒฝ์šฐ never ํƒ€์ž…์ด๋ฉฐ ๋น„์–ด์žˆ์ง€ ์•Š์„ ๊ฒฝ์šฐ ์ฒซ ์›์†Œ์˜ ํƒ€์ž…์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

ํ˜น์€ ์•„๋ž˜์™€ ๊ฐ™์ด ๋น„์Šทํ•œ ๋กœ์ง์œผ๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

type First<T extends any[]> = T extends { length: 0 } ? never : T[0];

์•„๋ž˜๋Š” ํ’€์ง€ ์•Š์€ 14๋ฒˆ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

/* _____________ ์—ฌ๊ธฐ์— ์ฝ”๋“œ ์ž…๋ ฅ _____________ */

type First<T extends any[]> = any;

/* _____________ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค _____________ */
import type { Equal, Expect } from "@type-challenges/utils";

type cases = [
  Expect<Equal<First<[3, 2, 1]>, 3>>,
  Expect<Equal<First<[() => 123, { a: string }]>, () => 123>>,
  Expect<Equal<First<[]>, never>>,
  Expect<Equal<First<[undefined]>, undefined>>
];

type errors = [
  // @ts-expect-error
  First<"notArray">,
  // @ts-expect-error
  First<{ 0: "arrayLike" }>
];

18๋ฒˆ

๋ฌธ์ œ: ๋ฐฐ์—ด(ํŠœํ”Œ)์„ ๋ฐ›์•„ ๊ธธ์ด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ œ๋„ค๋ฆญ Length<T>๋ฅผ ๊ตฌํ˜„ํ•˜์„ธ์š”.

๋‹ต์•ˆ:

type Length<T extends readonly any[]> = T["length"];

๋ฐฐ์—ด์„ ๋ฐ›์•„์•ผ ํ•˜๊ธฐ์— <T extends any[]> ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ readonly(์ฝ๊ธฐ ์ „์šฉ)๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด TypeScript๋Š” ๋ฐฐ์—ด์ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ๋ฐฐ์—ด ๊ธธ์ด์— ๋Œ€ํ•ด ์ถ”๋ก ์„ ํ•  ์ˆ˜ ์—†๊ฒŒ ๋˜๋ฉฐ ์ด์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. <T extends readonly any[]>๋กœ ๋ณ€๊ฒฝํ•จ์œผ๋กœ์จ ํ•ด๋‹น ๋ฐฐ์—ด์€ ๋” ์ด์ƒ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์—†๋Š” ๋ฐฐ์—ด์ด๋ฏ€๋กœ ํ•ด๋‹น ๋ฐฐ์—ด์˜ ๊ธธ์ด๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ดํ›„ T["length"]๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ๋ฐฐ์—ด์˜ ๊ธธ์ด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜๋Š” ํ’€์ง€ ์•Š์€ 18๋ฒˆ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

/* _____________ ์—ฌ๊ธฐ์— ์ฝ”๋“œ ์ž…๋ ฅ _____________ */

type Length<T> = any;

/* _____________ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค _____________ */
import type { Equal, Expect } from "@type-challenges/utils";

const tesla = ["tesla", "model 3", "model X", "model Y"] as const;
const spaceX = [
  "FALCON 9",
  "FALCON HEAVY",
  "DRAGON",
  "STARSHIP",
  "HUMAN SPACEFLIGHT",
] as const;

type cases = [
  Expect<Equal<Length<typeof tesla>, 4>>,
  Expect<Equal<Length<typeof spaceX>, 5>>,
  // @ts-expect-error
  Length<5>,
  // @ts-expect-error
  Length<"hello world">
];

43๋ฒˆ

๋ฌธ์ œ: T์—์„œ U์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…์„ ์ œ์™ธํ•˜๋Š” ๋‚ด์žฅ ์ œ๋„ค๋ฆญ Exclude<T, U>๋ฅผ ์ด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๊ตฌํ˜„ํ•˜์„ธ์š”.

๋‹ต์•ˆ:

type MyExclude<T, U> = T extends U ? never : T;

T extends U๋ฅผ ํ†ตํ•ด T์˜ ๊ฐ ์š”์†Œ๊ฐ€ U์— ํ• ๋‹น์ด ๊ฐ€๋Šฅํ•œ์ง€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์‚ผํ•ญ ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด ๋งŒ์•ฝ ๊ฐ€๋Šฅํ•˜๋ฉด never ํƒ€์ž…์„ ๋ฐ˜ํ™˜ํ•ด ํ•ด๋‹น ์š”์†Œ๋ฅผ ์ œ์™ธํ•˜๊ณ  ํ• ๋‹น์ด ๊ฐ€๋Šฅํ•˜์ง€ ์•Š๋‹ค๋ฉด ํ•ด๋‹น ์š”์†Œ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜๋Š” ํ’€์ง€ ์•Š์€ 43๋ฒˆ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

/* _____________ ์—ฌ๊ธฐ์— ์ฝ”๋“œ ์ž…๋ ฅ _____________ */

type MyExclude<T, U> = any;

/* _____________ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค _____________ */
import type { Equal, Expect } from "@type-challenges/utils";

type cases = [
  Expect<Equal<MyExclude<"a" | "b" | "c", "a">, "b" | "c">>,
  Expect<Equal<MyExclude<"a" | "b" | "c", "a" | "b">, "c">>,
  Expect<
    Equal<MyExclude<string | number | (() => void), Function>, string | number>
];

189๋ฒˆ

๋ฌธ์ œ: Promise์™€ ๊ฐ™์€ ํƒ€์ž…์— ๊ฐ์‹ธ์ธ ํƒ€์ž…์ด ์žˆ์„ ๋•Œ, ์•ˆ์— ๊ฐ์‹ธ์ธ ํƒ€์ž…์ด ๋ฌด์—‡์ธ์ง€ ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์„๊นŒ์š”?

๋‹ต์•ˆ:

type MyAwaited<T extends { then: unknown }> = Awaited<Promise<T>>;

Awaited๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—์„œ ์ œ๊ณตํ•˜๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ ํƒ€์ž…์œผ๋กœ Promise ํƒ€์ž…์—์„œ ๊ฐ์‹ธ์ ธ ์žˆ๋Š” ํƒ€์ž…์„ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, Promise<string>์„ ์ฒ˜๋ฆฌํ•  ๋•Œ Awaited<Promise<string>>๋Š” string์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ด ์ฝ”๋“œ์—์„œ Promise๋ฅผ ์‚ฌ์šฉํ–ˆ์œผ๋ฏ€๋กœ, T๊ฐ€ then ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด๋ผ๋ฉด Promise์ฒ˜๋Ÿผ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋‚ด๋ถ€์˜ ํƒ€์ž…์„ ์ถ”์ถœํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.