타입스크입트의 타입이 값의 집합임을 이해하기

[진욱] 집합의 원소를 타입이 될 수 있는 값이라고 생각하는게 좋을 것 같다. (집합의 원소를 객체의 속성으로 생각하면 안된다)

[동호] (예제 하나를 언급하며) 이걸 맞추면 어느정도 이해 된 것

interface Creature {
	name: string;
	birth: number;
	gender: "M" | "F";
};

interface Person {
	name: string;
	birth: number;
	gender: "M" | "F";
	nationality: string;
};

제목 없음.png

위 예제에서 Person이 Creature의 하위 집합임을 이해하면 좋다. 결국 결론은 객체의 속성을 늘릴수록 ‘제약조건’이 추가된다고 생각해보자.

[재희] 이걸 보면 도움이 될 듯.. 함수에서 a.b로 타입 narrowing 해줬는데 왜 에러가 나는지부터 생각해보면 좋을거 같다

type A = {a: string}
type B = {b: string}

type C = keyof(A | B) // never

type D = {a:number, b: string}

type E = keyof(A | D)

type F = {a: number, b: undefined}

type G = keyof(A | F)

function gett(a: A|B){
  if(a.b) {
    console.log(a.b)
  }
}

아래 코드의 (1) 에서 Cylinder는 타입으로 쓰였나 값으로 쓰였나

class Cylinder {
  radius = 1;
  height = 1;
}

function calculateVolume(shape: unknown) {
  if (shape instanceof Cylinder) { // --- (1)
    shape; // 정상. 타입은 Cylinder  // --- (2)
		shape.radius; // 정상. 타입은 number  // --- (3)
  }
}

[효리] (1)은 값 (2), (3)은 타입? instanceof 자체가 자바스크립트 문법이니까 뒤에는 값공간이다. 블록 안에서는 타입을 이용해 읽어들인다.(타입추론 말씀하신듯)

[태호] Cylinder가 만약 interface였으면 instanceof에서 에러가 날 것. class가 값과 타입으로 모두 쓰일 수 있어서 instanceof 뒤에서 타입으로 쓰이는것 같다.

[진욱] 값 공간이면서 타입 공간인 것 같다. (런타임 에서도 동작하고 타입스크립트의 타입 추론도 해준다)