
interface를 사용하여 생성할 수 있음TypeScript에서 변수를 선언할 때 아래와 같이 사용할 수 있음
➡️ 주로 객체(Object)의 구조를 정의하기 위해 사용되는 예약어
// interface를 선언할 때에는 ,가 아닌 ; 사용
interface User {
name : string;
age: number;
}
// 정상선언
const user: User = {
name : "Dave",
age: 20
}
// 프로퍼티의 순서를 지키지 않아도 정상선언
const user: User = {
age: 20,
name : "Dave"
}
// 정의된 프로퍼티보다 적게 작성했기 때문에 에러발생
const user: User = {
name: "anna"
}
// 정의된 프로퍼티보다 많이 작성했기 때문에 에러발생
const user: User = {
name: "anna",
age: 20,
job: "developer"
}
위 코드는 사용자 정보를 정의하기 위해 interface 예약어를 사용하여 User 인터페이스를 만들었음 인터페이스를 만들 때 예약어를 작성하고, 인터페이스의 이름을 "대문자"로 작성
➡️ 이렇게 인터페이스의 이름을 대문자로 시작하는 것을 *네이밍 컨벤션
💡 네이밍 컨벤션 ?
: 이름을 짓는 일종의 관례, TypeScript로 개발할 때 대부분의 개발자는 인터페이스의 이름을 대문자로 시작하도록 작성, 인터페이스는 객체의 타입을 정의하고, 객체가 대문자로 시작하는 것과 유사 ➡️ 일관성 있는 코드 작성을 위해 따르는 관례
그러나 인터페이스 안의 모든 프로퍼티가 필요한 것은 아니며,
어떤 조건에서만 존재하거나 아예 없는 경우도 발생할 수 있음
➡️ ? 연산자를 사용하여 "선택적 프로퍼티"를 작성할 수 있음
interface User {
name:string;
// ? 연산자를 이용하여 선택적 프로퍼티 작성
age?:number;
}
// age를 선언하지 않아도 정상선언
const user:User = {
name: "Dave"
}
인터페이스를 사용하여 객체의 프로퍼티 이름과 타입을 정의하고, 함수의 매개변수 타입과 반환타입도 정의할 수 있음
interface User {
name: string;
age: number;
job: string;
}
// 함수의 매개변수타입, 반환타입
interface Greeting {
(user:User, greeting: string): string;
}
const greet: Greeting = (user, greeting) => {
return `${greeting}, ${user.name}! Your job : ${user.job}.`;
}
const user: User = {
nema : "Dave",
age:24,
job: "developer"
};
const message = greet(user, "Hi");
console.log(message)
User 인터페이스 외에도 Greeting 인터페이스를 추가로 작성하여 함수타입을 정의Greeting 인터페이스는 User 타입과 문자열 타입을 매개변수로 받아 문자열 타입을 반환greet 함수는 Greeting을 사용하야 구현되었으며, user 객체와 문자열 Hi를 전달인자로 전달받아 문자열을 반환했음클래스 내에서도 아래와 같이 인터페이스를 사용할 수 있다.
interface Calculator {
add(x:number, y: number) : number;
substract( x: number, y: number): number;
}
class SimpleCalculator implements Calculator {
add( x: number, y: number) {
return x + y;
}
substract(x: number, y: number) {
return x - y;
}
}
const calculator = new SimpleCalculator();
console.log(calculator.add(4,9)); // 13
console.log(calculator.substract(10,5)); // 5
Calculator 인터페이스는 add 와 substract 매서드를 정의SimpleCalculator 클래스는 Calculator인터페이스를 사용하여 작성Calculator 인터페이스를 사용하고 있기 때문에 SimpleCalculator 클래스 내에는 Calculator 인터페이스 내에 정의된 두 매서드를 반드시 작성해야함// Todo 인터페이스를 작성합니다.
// Todo 인터페이스를 타입으로 받는 todos를 완성합니다.
let todos = [];
// Todo 인터페이스를 타입으로 받는 addTodo를 완성합니다.
function addTodo(todo) {
todos = [...todos, todo];
}
// Todo 인터페이스를 타입으로 받는 newTodo를 완성합니다.
const newTodo = {
id: 1,
content: 'learn typescript',
isDone: false,
};
addTodo(newTodo);
console.log(todos);
// Todo 인터페이스를 작성합니다.
interface Todo {
id: number;
content: string;
isDone: boolean;
}
// Todo 인터페이스를 타입으로 받는 todos를 완성합니다.
let todos: Todo[] = [];
// Todo 인터페이스를 타입으로 받는 addTodo를 완성합니다.
function addTodo(todo: Todo) {
todos = [...todos, todo];
}
// Todo 인터페이스를 타입으로 받는 newTodo를 완성합니다.
const newTodo: Todo = {
id: 1,
content: 'learn typescript',
isDone: false,
};
const secondTodo: Todo = {
id: 2,
content: 'typescript',
isDone: true,
};
addTodo(newTodo);
addTodo(secondTodo);
console.log(todos);

Javascript에서 클래스를 확장할 때 extends라는 키워드를 사용해 기존에 존재하던 클래스를 상속해 새로운 클래스를 정의할 수 있음
Class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
sayHello() {
console.log(`Hello, my name is ${this.name} and I'm ${this.age} years old.`);
}
}
// Person 클래스를 extends 키워드를 사용해 상속하여 새로운 클래스인 Student 정의
class Student extends Person {
constructor(name, age, grade) {
super(name, age);
this.grade = grade;
}
study() {
console.log(`${this.name} is styding hard for the grade ${this.grade}.`);
}
}
extends 라는 키워드를 사용하여 기존에 존재하던 인터페이스를 상속해 확장 가능interface Person {
name : string;
age: number;
}
interface Developer extends Person {
language: string;
}
const person: Developer = {
language: "Typescript",
age:20,
name: "Anna",
}
Person 인터페이스를 extends 키워드로 상속해 새로운 인터페이스인 Developer를 생성Developer 객체를 사용하여 person이라는 객체를 구현Developer 인터페이스는 Person 인터페이스를 상속하고 있으므로, Person 내부의 프로퍼티를 그대로 받아올 수 있다.interface FoodStuff {
name: string;
}
interface FoodAmount {
amount: number;
}
interface FoodFreshness extends FoodStuff, FoodAmount {
isFreshed: boolean;
}
const food = {} as FoodFreshness;
food.name = "egg";
food.amount = 2;
food.isFreshed = true;