Coding-Village-Protector / woowahan-ts

[우아한 타입스크립트 with 리액트] 북 스터디 📚
14 stars 2 forks source link

2.2.8 타입과 변수를 같은 이름으로 정의하여 사용할 수 있는 이유는? #4

Closed sryung1225 closed 9 months ago

sryung1225 commented 9 months ago

📝 54p

❓ 타입스크립트에서는 아래 코드와 같이 타입과 변수를 같은 이름으로 정의하여 사용할 수 있습니다. 이것이 가능한 이유를 컴파일타임 과 연관지어 설명하세요.

interface Hello {
  name: string;
}

const Hello: Hello = { name: "hi" };
lulla-by commented 9 months ago

타입스크립트에서 타입은 컴파일 시점에 결정되고 런타임 시점에 제거됩니다. 그렇기 때문에 타입과 변수의 이름이 같아도 사용이 가능해요!

Stilllee commented 9 months ago

타입스크립트에서 타입과 값은 서로 다른 네임스페이스에 존재합니다. 컴파일 과정을 거쳐 타입 정보는 제거되고, 자바스크립트 코드만 남게되는데 이때 런타임에서는 변수만 존재하게 됩니다.

이러한 구조 덕분에 타입과 변수는 충돌하지 않고 같은 이름으로 사용할 수 있습니다.

chaehaeun commented 9 months ago

타입스크립트에서는 값과 타입이 별도의 네임스페이스에 존재합니다. 컴파일타임에 타입 정보를 사용해 타입 검사를 하고, 컴파일이 완료되고 코드가 자바스크립트로 변환되면 타입 정보는 모두 제거됩니다. ⇒ 같은 이름을 가진 타입/값은 컴파일타임/런타임 서로 다른 문맥에서 사용되기 때문에 충돌하지 않습니다.

sryung1225 commented 9 months ago

타입스크립트는 컴파일 타임에 타입 선언을, 런타임에 변수 선언을 하기 때문에 서로 충돌하지 않습니다
타입스크립트는 자바스크립트에 새로운 기능을 추가해서 향상 시킨 슈퍼셋(Superset) 언어입니다. 이런 타입스크립트는 정적 타입 언어로 런타임보다 우선인 컴파일 타임에서 타입을 결정합니다. 컴파일 결과물로 타입이 모두 제거된 자바스크립트 소스코드가 반환되는 부분이 그 증거입니다.
즉, 타입 선언(interface Hello)과 변수 선언(const Hello) 둘은 서로 충돌하지 않습니다. 타입 선언된 부분은 변수 선언 이전에 제거됩니다. 때문에 타입과 변수를 같은 이름으로 선언해도 서로 충돌하지 않게 됩니다.
다만 가독성을 해치고 오해의 소지가 높기 때문에 일반적으로 사용하지 않습니다.
(연관 페이지: 36-37p (2.1.3 정적 타입과 동적 타입), 41p (2.1.5 컴파일 방식))