let str: string = 'hi';
let isSucceeded: boolean = true;
let decimal: number = 6;
let hex: number = 0xf00d;
let binary: number = 0b1010;
let n: null = null;
let u: undefined = undefined;
function create(o: object): void{}
// success
create({prop:0})
create([1,2,3])
// error
create('string')
// 배열을 저장하는 타입
let arr: number[] = [1, 2, 3]
// 제네릭을 사용한 타입 표기
let arr: Array<number> = [1, 2, 3]
// tuple
let arr:[string, number] = ['Hi', 6];
arr[1].concat('!'); // error
arr[3] = 'hello'; // 정의하지 않은 index 호출 시 오류
// enum, 특정 값(상수)들의 집합을 저장하는 타입
enum Car { BUS, TAXI, SUV };
let bus: Car = Car.BUS;
let bus: Car = Car[0];
enum Car {BUS = 1, TAXI = 2, SUV = 3};
let taxi: string = Car[2];
enum Car {Bus = 2, TAXI, SUV}
let taxi: string = Car[3];
// any
let str: any = 'hi'
let num: any = 10;
// void
// 변수로 사용하면 undefined와 null만 할당하고, 함수에는 반환 값을 설정할 수 없음.
let unknown: void = undefined;
function sayHi(): void {
console.log('hi');
}
// never
// 항상 오류를 발생시키거나 절대 반환하지 않는 타입, 종료되지 않는 함수
function neverEnd(): never {
while(true) {}
}
function error(message: string): never {
throw new Error(message);
}
interface ToDo {
title: string;
description: string;
}
function updateTodo(todo: ToDo, fieldsToUpdate: Partial<ToDo>) {
return {...todo, ...fieldsToUpdate}
}
const todo2 = updateTodo(todo1, {
description: 'abc',
});
const todo: Readonly<ToDo> = {
title: 'Delete inactive users',
}
// error
todo.title = 'hello';
interface Todo {
title: string;
description: string;
flag: boolean
}
type TodoPreview = Pick<Todo, 'title' | 'flag'>
const todo: TodoPreview = {
title: 'clean room',
flag: true,
description: 'description',
// error: description type이 선택되지 않았기 때문
}
type TodoPreview2 = Omit<Todo, 'description'>;
const todo2: TodoPreview2 = {
title: 'watch tv',
flag: false,
description: 'description',
// error: description type이 제거되었기 때문
}
// string | number
type T0 = Exclude<string | number | (() => void), Function>;
// () => void
type T0 = Extract<string | number | (() => void), Function>;
// string | number
type T0 = NonNullable<string | number | undefined | null>
type T0 = Parameters<() => string>; // []
type T1 = Parameters<(s: string) => void>; // [string]
type T2 = Parameters<(<T>(arg: T) => T)>; // [unknown]
type T3 = Parameters<string>; // error
interface Props {
a?: number;
b?: string;
}
const obj: Props = {a: 5};
// error => property b가 없기 때문
const obj2: Required<Props> = {a: 5};
JS와 TS에서 함수는 1급 객체!
1. 다른 함수에 매개변수로 제공 가능
2. 함수가 함수를 반환 가능
3. 변수에 할당가능(익명 함수)
function hello(name: string): string{
return `hello${name}`;
}
let hello = function (name: string): string{
return `hello${name}`;
}
let hello = (name: string): string => {
return `hello${name}`;
}
let f1 = function (x: number, y: number): number {
return x + y;
}
type add = (a: number, b: number) => number;
type sub = {
(a: number, b: number): number;
}
// (baseValue: number, increment: number) => number 부분이 옆의 function의 타입을 추론하는 데 도움을 줌
// x나 y의 type을 any로 변경해도 타입 에러가 발생하지 않는다.
let f2: (baseValue: number, increment: number) => number
= function (x, y) {
return x + y;
}
let f3: add = (a, b) => a + b;
function buildName(firstName: string, lastName?: string) {
return lastName ? `${firstName} ${lastName}` : `${firstName}`;
}
let result1 = buildName('sam');
let result2 = buildName('sam', 'adams');
// error: 인자의 개수가 초과됐기 때문
let result3 = buildName('sam', 'adams', 'paul');
// (lastName: string | undefined = 'unknown')과 동일하다.
function buildName(firstName: string, lastName = 'unknown') {
return `${firstName} ${lastName}`;
}
let result1 = buildName('park'); // park unknown
let result2 = buildName('kim', undefined); // kim unknown
function buildName(firstName: string, ...restOfName: string[]) {
return `${firstName} ${restOfName.join(' ')}`;
}
// sam adams paul
let result = buildName('sam', 'adams', 'paul');
interface IDBConfig {
host: string;
port: number;
user: string;
password: string;
schema?: string;
}