유틸리티 타입(1) : Partial / Required / Record / Readonly / Exclude
유틸리티 타입(2) : Extract / Omit / Pick / Parameters / NonNullable / ReturnType
출처) typescriptlang.org - Partial<Type>
출처2) TypeScript Utility Types Series' Articles
Extract<union타입명, 포함할 union타입 요소들>
union 타입에서 특정 요소들만 골라서 타입을 생성하고 싶다면 Extract 타입을 사용한다.
type myUnionType = "a"|"b"|"c"|"d";
let myFirstVar:Extract<myUnionType, "a"|"b"> = "a";
→ myFirstVar의 타입은 "a", "b"만을 포함한다.
⇒ myFirstVar는 "a" 또는 "b"만을 값으로 가질 수 있다!
type myUnionType = "a"|"b"|"c"|"d";
let myFirstVar:Extract<myUnionType, "a"|"b"|"x"> = "a";
→ "x"는 myUnionType에 없다..
⇒ myFirstVar는 여전히 "a", "b"만을 포함한다.
type myUnionType = "a"|"b"|"c"|"d";
//여기서 Extract 타입을 사용해도
let myFirstVar:Extract<myUnionType, "a"|"b"|"x"> = "a";
//myUnionType은 바뀌지 않는다.
let mySecondVar:myUnionType = "str";
Extract 타입은 union타입의 요소들 중에서 제한을 걸고 싶을 때 유용하게 사용할 수 있다.
Omit<타입명, 제외할요소들>
User타입에서 age와 lastActive를 제외한 새로운 타입을 지정할 수 있다.
type User = {
firstName: string;
lastName: string;
age: number;
lastActive: number;
}
type UserNameOnly = Omit<User, "age" | "lastActive">
→ Omit 타입에서 제외할 요소들을 지정하면 해당 요소를 제외한 User타입을 사용할 수 있다!
⇒ UserNameOnly 요소는 firstName과 lastName만 있다.
type User = {
firstName: string;
lastName: string;
age: number;
lastActive: number;
}
//UserNameOnly타입은 firstName, lastName만을 가진다.
type UserNameOnly = Omit<User, "age" | "lastActive">
//UserNameAndActive타입은 User타입에서 age만을 제외한 나머지 요소를 가진다.
type UserNameAndActive = Omit<User, "age">
const userByName:UserNameOnly = {
firstName: "John",
lastName: "Doe",
};
const userWithoutAge:UserNameAndActive = {
firstName: "John",
lastName: "Doe",
lastActive: -16302124725
}
Pick<타입명, 사용할 요소1 | 사용할 요소2 | ...>
type User = {
firstName: string,
lastName: string,
age: number
}
// UserName 타입은 User타입에서 firstName과 lastName을 요소로 가진다.
type UserName = Pick<User, "firstName" | "lastName">
let user:UserName = {
firstName: "John",
lastName: "Doe"
}
Parameters<typeof 함수명>
const myFunction = (a: string, b: string) => {
return a + b;
};
//passArray 변수에 튜플을 정의했다.
let passArray:[string, string] = [ 'hello ', 'world' ];
// myFunction에 spread연산자를 사용해 실행하였다.
myFunction(...passArray); // hello world
type myType = Parameters<typeof myFunction>
// type myType = [ a: string, b: string ]
let passArray:myType = [ 'hello ', 'world' ];
myFunction(...passArray // hello world
const myFunction = (a: string, b: string) => {
return a + b;
};
type aType = Parameters<typeof myFunction>[0];
type bType = Parameters<typeof myFunction>[1];
let a:aType = 'hello '
let b:bType = 'world'
myFunction(a, b) // hello world
type anotherType = Parameters<(a: string, b: number) => void>
NonNullable<Type명>
type myType = string | number | null | undefined;
type noNulls = NonNullable<myType>;
ReturnType<typeof 반환값이 있는 함수명>
function sendData(a: number, b: number) {
return {
a: `${a}`,
b: `${b}`
}
}
function sendData(a: number, b: number) {
return {
a: `${a}`,
b: `${b}`
}
}
type Data = {
a: string,
b: string
}
function consoleData(data:Data) {
console.log(JSON.stringify(data));
}
let stringifyNumbers = sendData(1, 2);
//stringifyNumbers에 sendData의 리턴값을 담는다.
// a: "1"
// b: "2"
consoleData(stringifyNumbers);
//stringifyNumbers를 consoleData함수의 인자로 넘긴다.
//결과 : {"a":"1","b":"2"}
function sendData(a: number, b: number) {
return {
a: `${a}`,
b: `${b}`
}
}
type Data = ReturnType<typeof sendData>
// type Data = {
// a: string,
// b: string
// }
피드백은 언제나 환영입니다!