Partial<Type>
)Pick<Type, Prop1 | Prop2>
)Omit<Type, Prop>
)interface Address {
email: string;
address: string;
}
const me: Address = {}; // Error
const you: Address = {email: "abc@def.com"}; // Error
const me: Partial<Address> = {}; // ✅ OK
const you: Partial<Address> = {email: "abc@def.com"}; // ✅ OK
interface Todo {
title: string;
desc: string;
completed: boolean;
}
const todo: Todo = {
title: "Clean Room",
completed: true
} // Error
const todo: Partial<Todo> = {
title: "Clean Room",
completed: true
} // ✅ OK
type TodoPreview = Pick<Todo, "title" | "completed">; // title, completed 만 골라서 사용
const todo: TodoPreview = {
title: "Clean Room",
completed: true
} // ✅ OK
(위의 예시 이어서 진행)
type TodoPreview = Omit<Todo, "desc">; // desc만 제거
const todo: TodoPreview = {
title: "Clean Room",
completed: true
} // ✅ OK
Exclude<UnionType, Type1 | Type2>
)Required<Type>
)Record<Keys, Type>
)type User = {
firstName: string,
lastName?: string // optional - 없어도 Not Error
}
const user: Required<User> = {
firstName: "Tom"
} // Error
interface CatInfo {
age: number;
breed: string;
}
type CatName = "miffy" | "boris" | "bordred"
const cats:Record<CatName, CatInfo> = {
miffy: {age: 9, breed: "ab"},
boris: {age: 3, breed: "cd"},
bordred: {age: 5, breed: "ef"}
}
type T0 = ReturnType<() => string> // string
type T1 = ReturnType<(s: string) => void> // void
class Ford implements Car {}
interface Part {}
class Ford implements Car, Part {} // Car클래스의 속성과 Part 인터페이스의 속성 모두 가지고 있어야 함
🤔 Extends vs Implements
- Extends는 직접 상속해서 사용 가능한 것
- Implements는 부모와 같은지 체크하는 것
interface IUser {
name: string;
age: number;
address: string;
}
type UserKeys = keyof IUser; // "name" | "age" | "address"
const user = {
name: "John",
age: 20,
address: "Seoul"
}
type UserKeys = keyof typeof user; // "name" | "age" | "address"
type AppConfig = {
name: string;
email: string;
};
type AppPremissions = {
changeName: boolean;
changeEmail: boolean;
};
Mapped Type
을 이용하는 것 권장.let arr = [1, 2, 3];
let StringArr = arr.map(value => value.toString()); // ['1', '2', '3']
type Users = 'Kim' | 'Lee' | 'Park';
type UserFirstNames = {[K in USers]: string}; // 하나씩 가져오고 string으로 전환
type UserAges = {[K in Users]: number}; // 하나씩 가져오고 number로 전환
위 타입은 아래와 같다.
type UserFirstNames = {
"Kim": string,
"Lee": string,
"Park": string
}
type UserAges = {
"Kim": number,
"Lee": number,
"Park": number
}
이 부분 이해 잘 안됨.
type DeviceFormatter<T> = {
[K in keyof T]: T(k);
}
type Device = {
manufact: string;
price: number;
fixed: boolean;
}
const phone: DeviceFormatter<Device> = {manufact: 'abc', price: 100, fixed: true};
// keyof로 인해 Device의 키들을 추출하여 Union으로 변환함
// Device<"manufact" | "price" | "fixed"> 가 됨
{
"lib": ["ESNext", "DOM"], // 사용할 라이브러리
}
컴파일러가 모듈을 찾는 방법
Relative, Non-Relative 인지 구분
- Relative: "../../module"
- Non-Relative: "module" (baseURL 기준으로 해석)
Classic, Node 전략 중 하를 이용하여 모듈을 찾을 위치를 알려줌
현재 기본 값은 Node 전략 (Relative 또는 Non-Relative)
// tsconfig
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@src/*": [
"scr/*"
]
}
}
}
// ts
import { bar } from '@src/bar'
true
로 설정 시, 모든 각각의 소스코드 파일을 모듈로 강제로 만들기 가능// @ts-check
사용하는 것과 동일d.ts
)