[진욱] 집합의 원소를 타입이 될 수 있는 값이라고 생각하는게 좋을 것 같다. (집합의 원소를 객체의 속성으로 생각하면 안된다)
[동호] (예제 하나를 언급하며) 이걸 맞추면 어느정도 이해 된 것
interface Creature {
name: string;
birth: number;
gender: "M" | "F";
};
interface Person {
name: string;
birth: number;
gender: "M" | "F";
nationality: string;
};
위 예제에서 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)
}
}
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 뒤에서 타입으로 쓰이는것 같다.
[진욱] 값 공간이면서 타입 공간인 것 같다. (런타임 에서도 동작하고 타입스크립트의 타입 추론도 해준다)