npm install -g typescript 로 타입스크립트 설치tsc --init 으로 tsconfig를 생성해 타입스크립트 설정을 한다tsc 파일.ts 로 타입스크립트 파일을 자바스크립트 파일로 변환npm install -g ts-node 로 ts-node 설치ts-node 파일.ts 로 자동으로 js 변환 후 실행한다.
let aa = 5;
let bb = 'hello';
let num: number = 2;
let str1: string = 'str';
let isTrue: boolean = true;
let undef: undefined;
let empty: null = null;
let numArr: number[] = [1, 2, 3, 10];
let strArr: Array<string> = ['a', 'b', 'c'];
let arr1: (number | string)[] = [1, 2, 'a', 'b', 3, 4];
let arr2: Array<boolean | null | number[]> = [true, false, null, [1, 2, 3]];
let obj: object = { name: 'aa', age: true };
순서와 규칙이 있는 배열에 tuple 타입을 설정한다
let drink: [string, string];
drink = ['cola', '콜라'];
let drink2: [string, string, number] = ['cola', '콜라', 12];
drink2[0] = '사이다';
정해진 갯수를 넘어서 값을 추가할 수 없다
readonly 옵션으로 추후 수정 불가능하게 설정
let drink3: readonly [string, string] = ['콜라', '사이다'];
// drink[0] = "사이다"; // error!!
미리 의미를 지정하고 그룹화해야할때 enum 타입을 설정한다
값을 따로 넣지 않으면 첫 요소부터 0부터 1씩 늘어나면서 할당
선언 이후로는 내용을 추가하거나 삭제할 수 없다
enum Auth {
admin = 0,
user = 1,
guest = 2,
}
enum Cafe {
americano = '아메리카노',
latte = '카페라떼',
}
console.log(Auth);
console.log(Auth.admin);
console.log(Auth.user);
console.log(Auth.guest);
console.log(Cafe.americano);
console.log(Cafe.latte);
any를 사용하면 js와 동일하게 타입설정이 없는것이기 때문에 사용을 지양
let value:any;
never
void
object 타입 대신 interface로 타입을 지정하면 오브젝트 key의 type까지 지정할 수 있다.
interface Student {
name: string;
isPassed: boolean;
}
const student1: Student = { name: 'allie', isPassed: true };
기존 interface로부터 상속을 받아서도 선언할 수 있다.
type Score = 'A+' | 'A' | 'B' | 'C' | 'D' | 'F';
interface 야구부 extends Student {
// Student에서 상속 받아온 정보
// name: string;
// isPassed: boolean;
position: string;
weight: number;
height: number;
readonly backNumber?: number; // 없어도 되는 값 ? 처리
[grade: number]: Score;
}
const otani: 야구부 = {
name: 'otani',
isPassed: true,
weight: 95,
height: 193,
backNumber: 17,
position: 'pitcher',
1: 'A',
2: 'C',
};
함수 타입을 interface로 정의할 수 있다.
interface Calc {
(a: number, b: number): number;
}
const sum: Calc = (num1: number, num2: number) => {
return num1 + num2;
};
여러 interface를 같이 사용할 수 있다.
- 중복을 제외한 interface의 타입 모두를 가져온다
interface Toy {
name: string;
start(): void; // 함수 중 리턴타입이 없을 경우 void 타입
}
interface Car {
name: string;
color: string;
price: number;
}
// 교차 타입 & -> Toy와 Car의 정보를 모두 만족해야 함
let toyCar: Toy & Car = {
name: '타요',
color: 'blue',
price: 50000,
start() {
console.log(this.name, '의 가격은', this.price, '입니다');
},
};
toyCar.start();
type Person = {
name: string;
age?: number;
like?: string[];
gender: string;
};
const daniel: Person = {
name: 'Daniel',
gender: 'f',
age: 21,
};오브젝트 뿐만 아니라 문자열, 숫자로 제한을 둘 수 있다.
- enum을 사용하면 같은 문자열이라도 설정한 enum에서 불러와야 한다.
enum GenderEnum {
FEMALE = 'Female',
MALE = 'Male',
}
// type Gender = 'Female' | 'Male';
type Gender = GenderEnum.FEMALE | GenderEnum.MALE;
type Person2 = {
name: string;
age?: number;
like?: string[];
gender: Gender;
};
const albert: Person2 = {
name: 'Albert',
like: ['car'],
gender: GenderEnum.MALE, // enum을 사용하면 같은 문자열이라도 설정한 enum에서 불러와야 한다.
};
ㅁㄴㅇㅁㄴㅇ
ㅁㄴㅇㅁㄴㅇ
ㅁㄴㅇㅁㄴㅇ
function tsPrint(a: number, b: number, c?: number): void {
console.log(a);
console.log(b);
console.log(c);
}
tsPrint(1, 2, 3);
console.log('---');
tsPrint(1, 2);
function tsPrint2(a: number, b: number, c: number = 5) {
console.log('print2!');
console.log(a);
console.log(b);
console.log(c);
}
tsPrint2(1, 2, 3);
tsPrint2(1, 2);
function concatStr(a: string, b: number): string {
return a + b;
}
function circleArea(r: number): number {
return r * r * Math.PI;
}
// 함수 표현식
const squareArea = (a: number, b: number): number => {
return a * b;
};
// return 키워드 없는 리턴
const triangleArea = (w: string, h: string): number =>
(Number(w) * Number(h)) / 2;
function add(x: string, y: string): string;
function add(x: number, y: number): number;
// 오버로딩 함수 구현
function add(x: any, y: any) {
return x + y;
}
console.log(add(1, 2));
console.log(add('1', '2'));
// console.log(add('1', 2)); // error , 정해진 타입으로 인자가 필요
function printSome<T>(x: T, y: T): T {
console.log('x와 y', x, y);
return x;
}
printSome<number>(1, 2);
printSome<string>('1', '2');
printSome<boolean>(true, false);
function printSome2<T, K>(x: T, y: K): T {
console.log('x와 y', x, y);
return x;
}
printSome2<number, string>(1, 'hello');
function arrLength<T>(arr: T[]): number {
return arr.length;
}
function getValue<T>(val: T): T {
return val;
}
console.log(arrLength<string>(['a', 'b']));
console.log(arrLength<string | number>([1, 2, 3, 'a', 'b']));
console.log(getValue('value'));
console.log(getValue<string[]>(['value']));