인터페이스는 클래스를 구현하기 전에 필요한 메서드를 정의하는 용도로 사용합니다.
타입스크립트에서는 좀 더 다양한 것들을 정의하는데 사용한다 .
age 는 속성이 number 이기때문에 문자열을 넣을려고 하면 에러가 발생한다.
선택 속성은 객체에서 없어도 되는 속성을 말하는데요
만약에 age 를 선택속성이 아니라
이렇게 정의를 했다면 에러가 발생하게 된다.
속성과 조금 다르기 때문이다 .
age 를 무조건 입력을 해야하고 undefined 를 입력해야한다는 의미이다.
그래서 undefined 를 입력해줘야한다.
물론 숫자를 입력해줘도 된다.
말 그대로 읽기전용이기때문에 값을 변경할려고 하면 에러가 발생하게 된다.
보통은 객체가 interface 에 정의되지 않은 속성값을 가지고 있어도 할당이 가능하다.
p2 객체 안에 birthday 라는 속성값이 있는데 , 하지만 Person 안에는 birthday 가 없다.
하지만
이와 같이 p2 를 Person 타입에 입력을 할수가 있다.
이유는 p3 타입이 p2 의 타입을 포함하는 더 큰 타입이기 때문이다.
나중에 타입 호환성 부분에서 더 자세히 설명을 할것이다.
지금은 이 코드에서 리터럴 로 값을 할당하고 있는데 이렇게 리터럴로 값을 초기화하는 경우에는 interface에 정의되지 않은 속성값이 있으면 타입에러가 발생한다.
이렇게 리터럴을 사용할 때 에러가 발생하는 이유는
역시나.. 사람의 실수가 높다.
그래서 이것은 실수를 줄여주기 위한 타입스크립트의 편의 기능 이라고 생각하면 된다
interface 에서 속성 이름을 구체적으로 정의하지 않고 ,
값의 타입만 정의하는 것을 인덱스 타입이라고 한다.
아무거나 입력을 해도 상관이 없다.
age 속성 타입이 위에 명시적으로 사용하기 있기때문이다.
자바스크립트에서는 속성 이름에 숫자와 문자열을 사용할 수 있다.
그리고 속성 이름에 숫자를 사용하면 내부적으로 문자열로 변환해서 사용을 합니다.
숫자의 값 A 는 B 로 할당 가능해야한다.
A 를 number 라고 정의하고 , B 를 string 또는 number 라고 정의했다.
그런데 이렇게 뒤에 뒤에부분을 지워주게 되면 ,
number 는 string 에 할당 가능하지 않기 때문에 , 에러가 발생한다.
interface 로 함수의 타입을 정의했는데, 왼쪽에 매개변수를 입력
오른쪽에 반환 타입을 입력
interface 로도 함수타입을 정의할수있다는것을 보여준거다.
interface 는 클래스로 구현될수있다.
만약에 interface 에서 정의한 속성을 정의하지 않으면 에러가 발생한다.
교차타입을 이용해서 여러개의 interface 를 확장할 수 있다.
교차타입은 집합에서 교집합과 같은 기능을 한다.
그런데 PP 의 타입이 name 속성만 포함하는게 아니다 왜지 ??
이것은 속성의 교집합이 아니라 타입이 가질 수 있는 값의 집합에 대한 교집합 이기 때문이다.