⭐️ 어떠한 것을 구현할 목적이 아니라 데이터를 담을 목적으로 사용하는 거면 인터페이스보다는 타입을 사용한다.
{
type PositionType = {
x: number;
y: number;
};
interface PositionInterface {
x: number;
y: number;
}
// object ★
const obj1: PositionType = {
x: 1,
y: 1,
};
const obj2: PositionInterface = {
x: 1,
y: 1,
z: 1,
};
// class ★
class Pos1 implements PositionType {
x: number;
y: number;
}
class Pos2 implements PositionInterface {
x: number;
y: number;
}
// Extends
interface ZPositionInterface extends PositionInterface {
z: number;
}
type ZPositionType = PositionType & { z: number };
// 😆 only interfaces can be merged.
interface PositionInterface {
z: number;
}
// type PositionType {
// }
// 😆 Type aliases can use computed properties
type Person = {
name: string;
age: number;
};
type Name = Person['name']; // string
type NumberType = number;
type Direction = 'left' | 'right';
}
다른 타입에 있는 키에 접근해서 그 키 값의 타입을 그대로 다시 선언할 수 있다.
{
const obj = {
name: 'ellie',
};
obj.name; // ellie
obj['name']; // ellie
type Animal = {
name: string;
age: number;
gender: 'male' | 'female';
};
type Name = Animal['name']; // string
const text: Name = 'hello';
type Gender = Animal['gender']; //'male' | 'female'
type Keys = keyof Animal; // 'name' | 'age' | 'gender'
const key: Keys = 'gender';
type Person = {
name: string;
gender: Animal['gender'];
};
const person: Person = {
name: 'ellie',
gender: 'male',
};
}
기존 타입을 이용하면서 좀 더 다른 형태로 변환할 수 있다.
{
type Video = {
title: string;
author: string;
};
// type VideoOptional = {
// title?: string;
// author?: string;
// };
// type VideoReadOnly = {
// readonly title: string;
// readonly author: string;
// };
// [1, 2].map(item => item * item); // [1, 4]
type Optional<T> = {
[P in keyof T]?: T[P]; // for...in
};
type VideoOptional = Optional<Video>;
type Animal = {
name: string;
age: number;
};
const animal: Optional<Animal> = {
name: 'dog',
};
animal.name = 'sean';
type ReadOnly<T> = {
readonly [P in keyof T]: T[P];
};
const video: ReadOnly<Video> = {
title: 'hi',
author: 'sean',
};
type Nullable<T> = { [P in keyof T]: T[P] | null };
const obj2: Nullable<Video> = {
title: 'hi',
author: null,
};
type Proxy<T> = {
get(): T;
set(value: T): void;
};
type Proxify<T> = {
[P in keyof T]: Proxy<T[P]>;
};
}
조건적으로 타입을 결정할 수 있다.
type Check<T> = T extends string ? boolean : number;
type Type = Check<string>; // boolean
type TypeName<T> = T extends string
? 'string'
: T extends number
? 'number'
: T extends boolean
? 'boolean'
: T extends undefined
? 'undefined'
: T extends Function
? 'function'
: 'object';
type T0 = TypeName<string>;
('string');
type T1 = TypeName<'a'>;
('string');
type T2 = TypeName<() => void>;
('function');