05.TS Interface
Updated:
TS Interface
1.What are Interface ?
interface Person1 {
name: string;
age: number;
}
// interface 사용하지 않고 직접 type 을 지정해준 것
function hello1(person: { name: string; age: number }): void {
console.log(`안녕하세요! ${person.name} 입니다`);
}
// interface 사용해서 type 을 지정해주는 것임
const p1: Person1 = {
name: "Jacob",
age: 80,
};
hello1(p1);
-
위 코드와 같이 interface 를 이용해서 type 을 간단히 지정해 줄 수 있습니다.
-
컴파일 하게 되면 JS 에서 아래와 같이 나타 납니다 (interface 없어짐..)
"use strict";
function hello1(person) {
console.log(
"\uC548\uB155\uD558\uC138\uC694! " + person.name + " \uC785\uB2C8\uB2E4"
);
}
// interface 사용해서 type 을 지정해주는 것임
var p1 = {
name: "Jacob",
age: 80,
};
hello1(p1);
- 📌 interface 는 TS 에서만 사용되는 문법입니다. 하지만, 중요하기 때문에 반드시 숙지를 하셔야 합니다.
2.optional property
사용법 1 => ? (물음표를 사용)
// ? 가 없으면 전부 필수 사항이기 때문에 꼭 넣어 야 되는 항목이지만, ? 가 있으면 있어도 되고 없어도 되는 항목이 됨
interface Person1 {
name: string;
age: number; // ? 가 없음..
}
interface Person2 {
name: string;
age?: number; // ? 기능은 optional 설정 name 은 필수고 age 는 option 이 된것임
}
function hello2(person: Person2): void {
console.log(`안녕하세요! ${person.name} 입니다.`);
}
hello2({ name: "Jacob", age: 80 });
hello2({ name: "Emma" }); // age 가 option 항목이기 때문에 값을 안넣어도 error 가 발생 되지 않음
사용법 2 => indexable type
// [index: string] 을 사용한 optional 지정 하는 방법
interface Person3 {
name: string;
age?: number; // ? 는 이게 있던지 없던지 option 이면
[index: string]: any; // [index: string] 은 어떠한 string 타입이 와도 괜찬아 라는 의미임
}
function hello3(person: Person3): void {
console.log(`안녕하세요 ${person.name} 입니다.`);
}
const p31: Person3 = {
name: "Jacob",
age: 80,
};
const p32: Person3 = {
name: "Emma",
sisters: ["kelly", "Sarah"], //
};
const p33: Person3 = {
name: "John",
father: p31,
mother: p32,
};
hello3(p33);
3.function in interface
interface Person4 {
name: string;
age: number;
hello(): void;
}
const p41: Person4 = {
name: "Jacob",
age: 80,
hello: function (): void {
// function 을 쓰는 경우
console.log(`안녕하세요 ${this.name} 입니다.`);
},
};
const p42: Person4 = {
name: "Jacob",
age: 80,
hello(): void {
// function 을 안쓴 경우도 크게 다르지 않는다
console.log(`안녕하세요 ${this.name} 입니다.`);
},
};
// const p43: Person4 = { // this 를 안쓰면 사용이 가능함
// name: 'Jacob',
// age: 80,
// hello:(): void => { // arrow function 을 쓴 경우, 대신 this 를 사용하지 못함
// console.log(`안녕하세요 ${this.name} 입니다.`);
// },
// }
p41.hello();
p42.hello();
- 실행 결과
4.class implements interface
- 이 방식은 OOP 객체 지향에서 많이 사용되는 방식임니다.
// interface 를 class 에 implements 하는 방법
interface IPerson1 {
name: string;
age?: number;
hello(): void;
}
// class 에 interface 를 가져와서 쓰는 방법
class Person implements IPerson1 {
name: string;
age?: number;
constructor(name: string) {
this.name = name;
}
hello(): void {
console.log(`안녕하세요! ${this.name} 입니다`);
}
}
const person: IPerson1 = new Person("Jacob");
person.hello();
5.interface extends interface
-
interface 를 가져 와서 추가할 interface 만 골라서 추가하는 방식 입니다.
-
즉, interface 끼리 상속 받아서 사용하는 방식 입니다
interface Iperson2 {
name: string;
age?: number;
}
interface IKorean extends Iperson2 {
city: string;
}
const k: IKorean = {
name: "고태현",
city: "서울",
};
// HTMLDivElement 를 사용할 때 유용하게 사용 됩니다.
6.function interface
interface HelloPerson {
(name: string, age?: number): void;
}
const helloPerson: HelloPerson = function (name: string, age: number) {
console.log(`안녕하세요! ${name} 입니다.`);
};
helloPerson("Jacob", 80);
// error 가 나는 이유는 interface 에 ? 사용해서 age 를 넣을 수도 있고 않넣을수도 있지만,
// 실제 function 안에서는 age 항상 있는걸로 만 표현 되기 때문에 error 가 발생
// 즉, function 안에 있는 것을 interface 의 type 형태와 동일하게 맞춰 줘야 함
interface HelloPerson {
(name: string, age?: number): void;
}
const helloPerson: HelloPerson = function (name: string) {
console.log(`안녕하세요! ${name} 입니다.`);
};
helloPerson("Jacob", 80);
// function 에 age 가 없는 걸로 하면 error 가 발생되지 않음
// 왜냐면, interface 에서 age 는 있어도 되고 없어도 되는걸로 설정했는데, 실제 function 에서 없는 걸로 표현했기 때문에 true
7.readonly interface properties
interface Person8 {
name: string;
age: number;
readonly gender: string;
}
const p81: Person8 = {
name: "Jacob",
gender: "male",
};
p81.gender = "female";
// gender 를 readonly 가 적용되어 있기 때문에 마지막 부분에 female 로 바꾸려고 하면 error 가 발생됨
// 만약 어떤 property 가 한번 만들고 바뀌지 않는 값을 설정 할 때는 readonly 를 붙여줘서 나중에 complie 할때, error 를 막아 줌
// TS 를 사용하는 가장 큰 이유는 code 에 의도를 담아서 이렇게 하면 안되요! 라고 명시 하기 위해 사용하는 게 크기 때문에
// 그래서 변경이 되지 않는 readonly 가 유용하게 쓰일 수 있다
8.type alias vs interface
8-1.function 를 사용시 차이점
// type alias
type EatType = (food: string) => void;
// interface
interface IEat {
(food: string): void;
}
8-2.arry 를 사용시 차이점
// type alias
type PersonList = string[];
// interface
interface IpersonList {
[index: number]: string;
}
8-3.intersection 를 사용시 차이점
interface ErrorHandling {
success: boolean;
error?: { message: string };
}
interface ArtistsData {
artists: { name: string }[];
}
// type alias
type ArtistsResponseType = ArtistsData & ErrorHandling;
// interface
interface IArtistsResponse extends ArtistsData, ErrorHandling {}
let art: ArtistsResponseType;
let iart: IArtistsResponse;
8-4.union types 를 사용시 차이점
- interface 는 union type 에 사용할 수 없음
interface Bird {
fly(): void;
layEggs(): void;
}
interface Fish {
swim(): void;
layEggs(): void;
}
type PetType = Bird | Fish;
interface Ipet extends PetType {} // error ts(2312): An interface can only extend an object type or intersection of object types with statically known members.
class Pet extends PetType {} // error ts(2422): 'PetType' only refers to a type, but is being used as a value here.
8-5.Delacration Merging - interface
-type alias 에서는 없는 기능 입니다.
// 똑같은 부분의 interface 를 사용하더라도, 나중에 사용할 때는 하나로 합치게 됨.
interface MergingInterface {
a: string;
}
interface MergingInterface {
b: string;
}
let mi: MergingInterface;
mi.
// 같은 이름으로 interface 가 작성 되었기 때문에 mergign 되었기 때문에, 골라서 사용이 가능하다
-
기존에 사용한 interface 에 추가해서 사용하고 싶을 때 선언하면 자동으로 합쳐져서 나중에 골라서 사용할 수 있습니다
-
🔶 type alias: 단순히 어떤 Type 을 부르는 이름이라고 생각하면 됩니다.
-
🔷 interface: 새로운 Type 을 만들어 낸다고 생각하면 됩니다.
🔶 🔷 📌 🔑
Reference
-
TypeScript Deep Dive - https://basarat.gitbook.io/typescript/project/compilation-context
-
TypeScript - https://www.typescriptlang.org/
-
HEROPY Tech - https://heropy.blog/2020/01/27/typescript/
-
DailyEngineering - https://hyunseob.github.io/2016/10/17/typescript-interface/
Leave a comment