Script - Utility Types 1
Utility Types
타입스크립트에서는 타입을 바꾸기위한 다양한 유틸리티 타입들이 존재한다.
Patial
Partial<Type>
은 타입의 모든 프로퍼티를 옵셔널하도록 바꿔준다
interface Todo {
title: string;
description: string;
}
function updateTodo(todo: Todo, fieldsToUpdate: Partial<Todo>){ // title?: string; description?: string; 과 같다.
return { ...todo, ...fieldsToUpdate };
}
const todo1:Todo = {
title: "organize desk",
description: "clear clustter",
};
const todo2 = updateTodo(todo1, {
description: "throw out trash",
});
Required
Required<Type>
은 타입의 모든 프로퍼티를 필수로 만들어준다.
interface Props {
a?: number;
b?: string;
}
const obj: Props = { a: 5 };
const obj2: Required<Props> = { a: 5 }; // a!: number; b!: string 과 같다.
// Property 'b' is missing in type '{ a: number; }' but required in type 'Required<Props>'.
Readonly
Readonly<Type>
은 타입의 모든 프로퍼티를 readonly로 만들어 변하지 않는 값으로 만들어준다.
interface Todo {
title: string;
}
const todo: Readonly<Todo> = {
title: "Delete inactive users",
}; // interface Todo { readonly title: string;} 와 같다.
todo.title = "Hello";
// Cannot assign to 'title' because it is a read-only property.
이 유틸리티 타입은 Object.freeze에서도 쓰인다.
function freeze<Type>(obj: Type): Readonly<Type>;
Record<Keys, Type>
Record<Keys, Type>
은 객체의 키를 문자열 리터럴 타입으로 제한하고 싶을 때 유용하다.
interface CatInfo {
age: number;
breed: string;
}
type CatName = "miffy" | "boris" | "mordred";
const cats: Record<CatName, CatInfo> = {
miffy: { age: 10, breed: "Persian" },
boris: { age: 5, breed: "Maine Coon" },
mordred: { age: 16, breed: "British Shorthair" },
};
비슷한 구조로 인덱스 시그니쳐가 있는데
type CatInfo {
[name:string]: {age:number; breed:string;}
}
인덱스 시그니쳐의 경우 문자열 리터럴을 Key값으로 사용하는 경우 오류가 발생하는 반면 Record Type의 경우에는 오류가 발생하지 않는다.
Author And Source
이 문제에 관하여(Script - Utility Types 1), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@changchanghwang/TypeScript-Utility-Types-1저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)