interface User {
id : number;
name : string;
age: number;
gender : "m" | "f";
}
type Userkey = keyof User; // id, name, age, gender 중에서 명시하겠다는 의미
const userkey : Userkey = "name"; // 다른걸 입력할 경우 에러
<T>
property를 모두 옵션으로 변경해주므로 일부만 사용이 가능하게 된다.
interface User {
id : number;
name : string;
age : number;
gender : "m" | "f";
}
let admin : Partial<User> = {
id : 1,
name : "Kim",
}
// 위의 admin은 다음 interface를 참조한 것이나 마찬가지이다.
// interface User {
// id? : number;
// name? : string;
// age? : number;
// gender? : "m" | "f";
// }
단, 없는 프로퍼티를 입력할 경우 에러
<T>
Partial과 반대로 모든 프로퍼티를 필수로 설정해준다.
다음과 같이 프로퍼티에 옵셔널이 걸려있어도 Required를 걸게 되면 필수항목이 되는 것이다.
interface User {
id? : number;
name? : string;
age? : number;
gender? : "m" | "f";
}
let admin : Required<User> = {
id : 1,
name : "Kim",
age : 20,
gender : "m"
}
<T>
readonly와 동일한 역할로 할당만 가능하고 수정이 불가능하다.
<K, T>
<K, T>에서 K는 key, T는 type이다.
다음과 같이 학년별로 점수를 매기는 함수가 있다고 하자.
interface Score {
"1" : "A" | "B" | "C" | "D";
"2" : "A" | "B" | "C" | "D";
"3" : "A" | "B" | "C" | "D";
"4" : "A" | "B" | "C" | "D";
}
const winter_score : Score ={
1 : "A",
2 : "B",
3 : "D",
4 : "A"
}
이때 Record를 이용한다면 interface 부분을 지우고 다음과 같이 작성가능하다.
const winter_score : Record<"1"|"2"|"3"|"4","A"|"B"|"C"|"D"> ={
1 : "A",
2 : "B",
3 : "D",
4 : "A"
}
하지만 해당하는 키, 타입 값이 늘어날수록 가독성이 떨어진다. 따라서 다음과 같이 값을 type으로 따로 선언하여 정리할 수 있다.
type Grade = "1"|"2"|"3"|"4";
type Score = "A"|"B"|"C"|"D";
const winter_score : Record< Grade, Score > = {
1 : "A",
2 : "B",
3 : "D",
4 : "A"
}
Pick<T, K> : 특정 프로퍼티만 사용하겠다.
const admin : Pick<User, "id" | "name" >
일 경우 ,User interface에서 id 와 name만 쓰겠다는 의미이다.
Omit<T, K> : 특정 프로퍼티를 제외하고 쓰겠다.
const admin : Omit<User, "id" | "name" >
일 경우 ,User interface에서 id 와 name는 제외하고 쓰겠다는 의미이다.
Exclude<T1, T2> : T1에서 T2를 제외하겠다.
NonNullable< T1 > : T1에서 null, undefined를 제외한다.