TypeScript Generics

Assertion with as

<aside> โ˜๐Ÿป linkedList๋ฅผ, ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์‹ถ์–ด์„œ, ๊ผญย Movieย ํƒ€์ž… ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์–ด๋–ค object๋“  ๋‹ด์„ ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค์—ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‹ค ๋ณด๋‹ˆ,ย MovieRankย ์•ˆ์—์„œย linkedListย ๊ด€๋ จ ๋กœ์ง์„ ์“ธ ๋•Œ๋Š”, type์„ ๋ณ€ํ™˜(as keyword)ํ•ด์ค˜์•ผ ํ•˜๋Š” ๊ท€์ฐฎ์Œ์ด ์žˆ์—ˆ๋‹ค.

</aside>

update: (title: string, tikets: number, startNode = headNode) => {
      // list๋ฅผ mapํ•  ๋•Œ, ํŠน์ • title์„ ๊ฐ€์ง„ movie์˜ tikets๋ฅผ ์—…๋ฐ์ดํŠธ
      const updateTikets = (value: object | null) => {
        if (value === null) return null;

        const movie = value as Movie;
        if (movie.title === title) {
          movie.tikets = tikets;
          return movie as object;
        }
        return value;
      };

      const moviesList = listValues(
        mapList(startNode, updateTikets)
      ) as Movie[];
      return createMovieRank(moviesList);
    },

mapList()ย ํ•จ์ˆ˜๋Š”ย linkedListย ๊ด€๋ จ ํ•จ์ˆ˜๋กœ, ์ข€ ๋” ์ผ๋ฐ˜์ ์ธย object๋ฅผ ๋ฐ›๋Š”๋‹ค.

๊ทธ ์•ˆ์—ย Movie๊ฐ€ ๋“ค์–ด๊ฐˆ ๊ฒƒ์„ ๋‚˜๋Š” ์•Œ์ง€๋งŒ, typeScript๋Š” ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์—,ย updateTikets๋ผ๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ์•ˆ์—์„œ,ย movie **as** object์œผ๋กœ ํƒ€์ž…์„ ๋ฐ”๊ฟ”์ค˜์•ผ ํ–ˆ๋‹ค.

Generics with <T>

์ƒ๊ฐํ•ด๋ณด๋‹ˆ, TypeScript์—๋Š” ์ด๋Ÿด ๋•Œ๋ฅผ ์œ„ํ•ดย generic์ด ์žˆ์—ˆ๋‹ค. ์ด์— ๋Œ€ํ•ด ๋” ํ•™์Šตํ•ด๋ดค๋‹ค.

์šฐ์„ , ํƒ€์ž…์„ ์ด๋Ÿฐ ์‹์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

type ListNode<T> = {
  value: T | null;
  next: ListNode<T> | null;
};

const createNode = <T>(value: T | null): ListNode<T> => {
  return {
    value: value,
    next: null,
  };
};

์ด์ œย update()๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์•„์ง„๋‹ค.

const update = (
  title: string,
  tikets: number,
  startNode: ListNode<Movie>
) => {
  // list๋ฅผ mapํ•  ๋•Œ, ํŠน์ • title์„ ๊ฐ€์ง„ movie์˜ tikets๋ฅผ ์—…๋ฐ์ดํŠธ
  const updateTikets = (value: Movie | null): Movie | null => {
    if (value === null) return null;

    if (value.title === title) {
      value.tikets = tikets;
      return value;
    }
    return value;
  };

  const updatedList = mapList(startNode, updateTikets);
  const moviesList = listValues(updatedList);

  return createMovieRank(moviesList); // Assuming createMovieRank is defined elsewhere
};

Type Assertion์„ ํ•ด์ฃผ์ง€ ์•Š์•„๋„ ๋œ๋‹ค!


References

https://www.typescriptlang.org/docs/handbook/2/generics.html