{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"strict": true,
"esModuleInterop": true
}
}
만약, typescript가 설치되어 있지 않는 경우 다음 명령어로 설치
< typescript 설치 명령어(전역적으로 설치) >
yarn global add typescript
const message: string = "hello world";
: string과 같이 해당 상수 값의 타입 명시 → 다른 타입을 사용할 경우 오류 발생(string으로 명시하였는데, 값을 숫자로 설정하는 경우)
let count = 0; //숫자
count += 1;
count = "갑자기 분위기 문자열"; //에러 발생
const message: string = "hello world"; //문자열
const done: boolean = true; //불리언 값
const numbers: number[] = [1, 2, 3]; //숫자 배열
const messages: string[] = ["hello", "world"]; //문자열 배열
message.push(1); //에러 발생 -> 숫자는 안됨
let mightBeUndefined: string | undefined = undefined; //string/undefined 둘중에 하나
let nullableNumber: number | null = null; // number/null 둘중에 하나
let color: "red" | "orange" | "yellow" = "red"; //red/orange/yellow 셋 중에 하나
color = "yellow";
color = "green"; //3개말고 다른거면 에러
function sum(x: number, y: number): number {
return x + y;
}
sum(1, 2);
function sumArray(numbers: number[]): number {
return numbers.reduce((acc, current) => acc + current, 0);
}
const total = sumArray([1, 2, 3, 4, 5]);
인터페이스(interface): 변수, 함수, 클래스가 만족해야하는 최소규격 지정 해주는 도구
→ 인터페이스를 선언한 변수, 함수, 클래스는 해당 인터페이스를 준수해야함
<클래스에서 인터페이스 사용해보기>
// shape 라는 interface 선언
interface Shape {
getArea(): number;
//Shape interface에는 getArea라는 함수가 꼭 존재해야하고 반환값는 숫자이어야함
}
class Circle implements Shape {
//`implements`키워드 사용하여 해당 클래스가 Shape interface의 조건 충족하겠다고 명시
radius: number; //멤버 변수 radius 타입 설정
constructor(radius: number) {
this.radius = radius;
}
// 너비 가져오는 함수 구현
getArea(): number {
return this.radius * this.radius * Math.PI;
}
}
class Rectangle implements Shape {
width: number;
height: number;
constructor(width: number, height: number) {
this.width = width;
this.height = height;
}
getArea(): number {
return this.width * this.height;
}
}
const shapes: Shape[] = [new Circle(5), new Rectangle(10, 5)];
shapes.forEach((shape) => {
console.log(shape.getArea());
});
// shape 라는 interface 선언
interface Shape {
getArea(): number;
//Shape interface에는 getArea라는 함수가 꼭 존재해야하고 반환값는 숫자이어야함
}
class Circle implements Shape {
//`implements`키워드 사용하여 해당 클래스가 Shape interface의 조건 충족하겠다고 명시
constructor(public radius: number) {
this.radius = radius;
}
// 너비 가져오는 함수 구현
getArea(): number {
return this.radius * this.radius * Math.PI;
}
}
class Rectangle implements Shape {
constructor(private width: number, private height: number) {
this.width = width;
this.height = height;
}
getArea(): number {
return this.width * this.height;
}
}
const circle = new Circle(5);
const rectangle = new Rectangle(10, 5);
console.log(circle.radius);
console.log(rectangle.width); //불가능
const shapes: Shape[] = [new Circle(5), new Rectangle(10, 5)];
shapes.forEach((shape) => {
console.log(shape.getArea());
});
<일반 객체에서 interface 사용>
// 일반객체에서의 인터페이스 사용
interface Person {
name: string;
age?: number;
}
interface Developer {
name: string;
age?: number;
skills: string[];
}
const person: Person = {
name: "김사람",
age: 20,
};
const expert: Developer = {
name: "김개발",
skills: ["javascript", "react"],
};
// 일반객체에서의 인터페이스 사용
interface Person {
name: string;
age?: number;
}
interface Developer extends Person {
skills: string[];
}
const person: Person = {
name: "김사람",
age: 20,
};
const expert: Developer = {
name: "김개발",
skills: ["javascript", "react"],
};
const people: Person[] = [person, expert];
type: 특정 타입에 별칭을 붙이는 용도로 사용
→ 객체를 위한 타입 설정, 별칭 설정 등
// Type Alias
type Person = {
name: string;
age?: number;
};
type Developer = Person & {
skills: string[];
};
const person: Person = {
name: "김사랑",
};
const expert: Developer = {
name: "김개발",
skills: ["javascript", "react"],
};
type People = Person[];
const people: People = [person, expert];
type Color = "red" | "orange" | "yellow";
const color: Color = "red";
const colors: Color[] = ["red", "orange"];
❗️ type과 interface의 용도
일관성있게 아무거나 사용해도 상관은 없지만, 클래스 관련 타입은 interface사용하는게 좋고, 일반 객체 타입은 type을 사용해도 무방하다.
함수, 클래스, 인터페이스, 타입 별칭을 사용하게 될 때 여러 종류의 타입에 대하여 호환을 맞춰야 하는 상황에서 사용하는 문법
제네릭(Generic)
데이터 형식에 의존하지 않으면서, 다른 데이터 타입들로 사용할 수 있는 방법
즉, 재사용성이 높은 컴포넌트를 만들 때 자주 활용되는 특징으로, 한가지 타입보다 여러가지 타입에서 동작하는 컴포넌트를 생성하는데 사용
[사용방법]
// generics 사용 전
function getText(text: any): any {
return text;
}
getText("hi"); //hi
getText(10); //10
getText(true); //true
위와 같이 어떤 값을 넣을지 또는 어떤 값을 반환할지 모르는 경우(any사용한 경우) 제네릭을 사용하면 됨
// generics 사용
function getText<T>(text: T): T {
return text;
}
getText<string>("hi"); //hi
getText<number>(10); //10
getText<boolean>(true); //true
interface Itmes<T> {
list: T[];
}
const items: Itmes<string> = {
list: ["a", "b", "c"],
};
type Itmes<T> = {
list: T[];
};
const items: Itmes<string> = {
list: ["a", "b", "c"],
};
class GenericMath<T>{
pi: T;
sum: (x:T, y: T) => T;
}
let math = new GenericMath<number>();