type Record<K, T> = {
[P in K]: T;
}
type IFieldValue = {
name: string;
value: number;
};
type IFormName = 'event' | 'point'; // 타입 별칭 (string 중에서도 이 두 문자만 가능)
const x: Record<IFormName, IFieldValue> = {
event: {
name: 'foo',
value: 0,
},
point: {
name: 'bar',
value: 1,
}
}
type Exclude<T, U> = T extends U ? never : T;
type OnlyNumber = Exclude<string|number, string>; // OnlyNumber = number 타입
type Event = {
id: string;
title: string;
};
type Point = {
target: string;
amount: number;
};
type PointInfo = Extract<Event|Point, Point>; // PointInfo는 Point 타입
type Pick<T, K extends keyof T> = {
[P in K]: T[P]
};
interface Event {
id: string;
title: string;
isDone: boolean;
startDate: string;
};
// BaseInfo = Picked
type BaseInfo = Pick<Event, 'id' | 'title'>;
interface Picked = {
id: string;
title: string
}
<T>
type Partial<T> = {
[P in keyof T]?: T[P]
};
interface UserInfo {
age: number;
profile: string;
phone: string;
}
type OptionalUserInfo = Partial<UserInfo>;
// 아래와 동일
// interface UserInfo {
// age?: number;
// profile?: string;
// phone?: string;
// }
<T>
type Required<T> = {
[P in keyof T]-?: T[P];
};
interface UserInfo {
age: number;
profile?: string;
phone?: string;
}
type RequiredUserInfo = Required<UserInfo>;
// 아래와 동일
// interface UserInfo {
// age: number;
// profile: string;
// phone: string;
// }
<T>
type ReadOnly<T> = {
readonly [P in keyof T]: T[P]
};
interface eventState {
title: string;
id: number;
}
const event: ReadOnly<eventState> = {
title: 'new event',
id: 123,
};
event.title = 'Hello'; // 값 변경 시 에러 발생
1번째 항 타입에서 2번째 항의 프로퍼티를 생략하고 반환
type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;
type Event = {
id: number;
title: string;
detail: string;
};
// Event 타입에서 detail 속성 삭제
type BasicEventInfo = Exclude<keyof Event, "detail">; // { id: number, title: string }
<T>
타입에서 null과 undefined를 제거한 타입을 반환
type NonNullable<T> = T extends null | undefined ? never : T;
type NotNullType = NonNullable<string | number | undefined>;
// null이나 undefined를 제거하고 반환 => NotNullType 타입은 string | number
<T>
T 자리에 함수 또는 typeof로 가리키는 타입이 들어감
함수가 반환하는 값 또는 typeof로 연산된 타입 반환
type ReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : any;
type T0 = ReturnType<() => string>; // string
type T1 = ReturnType<(prev: string) => void>; // void
interface Payload {
foo: string;
bar: string;
}
const fooBarCreator = (): Payload = > ({
foo: "foo",
bar: "bar"
});
type FooBarCreator = ReturnType<typeof fooBarCreator>; // typeof fooBarCreator이 Payload 타입