type A = { id: number; name: string }
type B = { name: string; age: number }
type AB = A & B
// AB는 { id: number; name: string; age: number }가 된다.
type Status = "loading" | "success" | "error"
function printStatus(s: Status) {
// s는 세 값 중 하나만 가능
}
interface Base { id: number }
interface User extends Base { name: string }
// User는 id와 name 모두 포함
function printId<T extends Base>(item: T) {
console.log(item.id)
}
const value: any = "123"
const num = value as string
type GetArrayElement<T> = T extends (infer U)[] ? U : never
type ElementType = GetArrayElement<string[]> // string
type ElementType2 = GetArrayElement<number[]> // number
interface Animal { name: string }
interface Dog extends Animal { bark(): void }
// Dog는 name과 bark() 모두 포함
type WithTimestamp = { createdAt: Date }
type UserWithTimestamp = User & WithTimestamp
type A = Pick<User, "id" | "name">
type B = Omit<User, "password">
type C = Partial<User>
type D = Required<User>
type E = Readonly<User>
타입의 모든 키를 유니언 타입으로 반환
type UserKeys = keyof User // "id" | "name" | "email" ...
키/값 구조의 타입을 생성
type Dict = Record<string, number>
// { [key: string]: number }
변수/함수의 타입 추출
const obj = { a: 1, b: "2" }
type ObjType = typeof obj // { a: number; b: string }
문법역할/용도예시
& | 교차(합치기) | A & B |
| | 유니언(둘 중 하나) | `"a" |
extends | 확장/상속/제네릭 제약 | interface A extends B / T extends X |
as | 타입 단언 | value as string |
infer | 타입 추론 | T extends (infer U)[] ? U : never |
keyof | 타입의 모든 키 유니언으로 | keyof User |
typeof | 변수/함수의 타입 가져오기 | typeof obj |
Pick/Omit | 타입 속성 추출/제외 | Pick<T, K>, Omit<T, K> |
Partial | 모든 속성을 Optional로 | Partial<T> |
Required | 모든 속성을 Required로 | Required<T> |
Readonly | 모든 속성을 읽기 전용 | Readonly<T> |
Record | 키-값 형태 타입 생성 | Record<string, number> |
TypeScript Omit<T, K> 정리 (0) | 2025.06.22 |
---|