본문으로 건너뛰기

아이템8

타입 공간과 값 공간의 심벌 구하기

  • 심벌은 이름이 같더라도 속하는 공간에 따라 다른것을 나타낸다.
// 타입으로 쓰인 Cylinder
interface Cylinder {
radius: number;
height: number;
}

// 값으로 쓰인 Cylinder
const Cylinder = (radius: number, height: number) => ({ radius, height });
  • type이나 interface다음에 나오는 심벌은 타입인 반면 constlet선언에 쓰이는 것은 값이다.
  • 일반적으로 :뒤엔 type = 뒤엔 값이 쓰인다.

일반적으로 typeof는 사용처에따라 다른 값을 반환한다.

interface Person {
first: string;
last: string;
}

const p: Person = { first: "JANE", last: "JACOBS" };

// typeof는 타입으로 쓰일 때와 값으로 쓰일 때가 다른 기능을 한다.
type T1 = typeof p; // 타입은 Person8

const v1 = typeof p; // 값은 'object' => 런타임의 typeof 연산자

console.log(v1);

InstanceType<>은 생성자 함수의 리턴타입을 반환한다.

const v = typeof Cylinder; // 값이 'function'

type T8 = typeof Cylinder; // 타입이 typeof Cylinder => === Cylinder 생성자 함수

// InstanceType: 생성자 함수의 리턴 타입을 얻는다.
// InstanceType 제네릭을 이용하여 생성자 타입과 인스턴스 타입을 전환할 수 있다.

type C = InstanceType<typeof Cylinder>; // 타입이 Cylinder

[]를 이용한 속성으 타입에 접근

const first: Person8["first"] = p["first"]; // []를 이용하여 속성의 타입에 접근 가능하다.

타입스크립트에서의 구조 분해 할당

function email({ person: Person, subject: string }) {}
  • 위 코드는 값의 관점에서 Person과 String이 해석되었기 떄문에 오류가 발생한다.
  • 이룰 해결 하기 위해선 타입과 값을 구분해줘야한다.
function email({ person, subject }: { person: Person; subject: string }) {}

타입 단언보단 타입 선언을 사용한다.