내일배움캠프[4기_Reac트랙]/[원격]TS

7. interface & Intersection Type

ecoEarth 2023. 1. 16. 22:59

기본 정의

interface Person {
  name: string;
  age: number;
}

const person1: Person = { name: 'js', age: 20 };
const person2: Person = { name: 'ljs', age: 'twenty' }; // Error

 

선택 속성

interface Person {
  name: string;
  age?: number;
}

const person1: Person = { name: 'js' };

 

Read only 속성

interface로 객체를 생성할때에만 값을 할당할 수 있고, 그 이후에는 변경할 수 없는 속성이다.

Q.마치 const같은 것??

⚠️ReadonlyArray<number>

interface Person {
  readonly name: string;
  age?: number;
}

const person1: Person = { name: 'js' };
person1.name = 'ljs'; // Error

let readOnlyArr: ReadonlyArray<number> = [1,2,3];
readOnlyArr.splice(0,1); // error
readOnlyArr.push(4); // error
readOnlyArr[0] = 100; // error

 

index type

interface Person {
  readonly name: string;
  [key: string]: string | number;
}

const p1: Person = { name: 'js', birthday: '비밀', age: 20 };
  • 다음의 차이에 주목하자. index type은 지정해준 타입만 같다면 계속 추가할 수 있다.
  • index signature

 

함수 타입

interface Print {
  (name: string, age: number): string;
}
// type Print = (name: string, age: number) => string;

const getNameAndAge: Print = function (name, age) {
  return `name: ${name}, age: ${age}`;
};

 

인터페이스 확장

interface Person {
  name: string;
  age: number;
}

interface Korean extends Person {
  birth: 'KOR';
}

interface Korean {
  name: string;
  age: number;
  birth: 'KOR';
}

interface Developer {
  job: 'developer';
}

interface KorAndDev extends Korean, Developer {}

interface KorAndDev {
  name: string;
  age: number;
  birth: 'KOR';
  job: 'developer';
}

 

intersection Type: 여러 타입을 모두 만족하는 하나의 타입

interface Person {
  name: string;
  age: number;
}

interface Developer {
	name: string;
  skill: string;
}

type DevJob = Person & Developer;

const nbcPerson: DevJob = {
  name: 'a',
  age: 20,
  skill: 'ts',
};

type vs interface

  • 타입 별칭과 인터페이스의 가장 큰 차이점은 타입의 확장 가능 / 불가능 여부입니다.
  • 인터페이스는 확장이 가능한데 반해 타입 별칭은 확장이 불가능합니다.
  • 따라서, 가능한한 type 보다는 interface로 선언해서 사용하는 것을 추천합니다.