-
Typescript Generics와 Keyof, Mapped Types 사용해보기TypeScript 2023. 3. 10. 19:59
타입스크립트에서 제네릭, Mapped Types을 사용해보고, keyof 키워드는 어느 상황에서 사용할 수 있을지 사용해보았다.
interface dynamic { [key: number] : string, } const keys: dynamic = {1: 'one', 2: 'two'};타입스크립트에서는 위처럼 동일한 타입의 key-value값들을 갖는 객체를 정의할 수 있다.
다만, 이 경우 value의 타입은 맨 처음의 선언한 것에서 바뀔 수 없는 단점이 있다.
제네릭을 사용하여 더 확장성있게 코드를 작성할 수 있다.
interface dynamic<T> { [key: number] : T, } const str: dynamic<string> = {1: 'one', 2: 'two'}; const num: dynamic<number> = {1: 100, 2: 200};함수를 사용할 때도 제네릭을 사용할 수 있다.
function consoleType<T>(arg: T): T { console.log(arg); return arg; } consoleType<string>("hi"); consoleType<number>(123);keyof 키워드는 객체의 key값들을 타입으로 만들 수 있게 해준다.
interface t { name: string, 100: number } type tType = keyof t; const nickname: tType = 'name'; const age: tType = 100; const score: tType = 20; // ERROR위의 인터페이스는 각각 name과 100을 key값으로 가지는 객체의 타입을 선언하고 있다.
이때 keytype으로 인터페이스의 키값들을 가져올 수 있고, name이나 100만을 가지는 타입 변수를 만들 수 있다.
interface p { [key: string]: number, } type pType = keyof p; const variable: pType = 'apple'위와 같이 mapped type으로 생성된 타입에서는 키 값에 할당된 변수의 타입을 가져오기에 위에서 variable은 string의 값을 가지는 변수가 될 수 있다.
keytype을 응용하여 다음과 같은 코드를 작성할 수 있다.
type OptionsFlags<Type> = { [Property in keyof Type]: boolean; };위의 타입 코드는 타입스크립트 공식문서에서 확인할 수 있는 코드인데, 언뜻 보기에 바로 이해하기가 쉽지 않다.
말로 풀어 설명하자면, Type을 순회하면서 keyof로 key값을 가져온다. 그리고 그 가져온 key값에 제네릭으로 받은 새로운 value 타입을 할당하는 방식이다.
실제 사용 예를 보면 다음과 같다.
interface User { name: string, age: number, job: boolean, } type OptionsFlags<Type> = { [Property in keyof Type]: boolean; }; const variable: OptionsFlags<User> = { name: false, age: true, job: false, };요약하자면, 같은 키값을 가지지만, value의 타입은 다른 객체에 대한 타입을 생성할 수 있는 것이다.
https://www.typescriptlang.org/ko/docs/handbook/2/mapped-types.html
Documentation - Mapped Types
이미 존재하는 타입을 재사용해서 타입을 생성하기
www.typescriptlang.org
'TypeScript' 카테고리의 다른 글
타입스크립트 Type Aliases & Interfaces 알아보기 (0) 2023.05.09 타입스크립트 에러 해결 (단항 더하기 연산자) : The left-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type.ts(2362) (0) 2023.04.04 typescript Record 타입 사용하기 (1) 2023.03.29 타입스크립트에서 /// <reference ... /> 의 의미 (Triple-Slash Directives) (0) 2023.03.01 TypeScript 시작하기 & React에서 Typescript 정리 (1) 2022.11.10