앰비언트 선언도 선언병합이 된다.
앰비언트 선언 (declare)
타입 정보만 제공하는 선언
실제 구현이 존재하지 않는 코드의 타입을 정의 (코드 구현부 없음)
외부 라이브러리의 타입을 알리는데 사용됨
즉, 외부 라이브러리를 가져다 쓰는데 자바스크립트로만 된 코드의 경우 직접 타이핑 해야할 때 사용
declare
예약어를 사용
declare
로 앰비언트 선언할 때는 반드시 해당 값이 실제로 존재함을 확인해야 한다.
인터페이스와 타입 별칭도 declare로 선언 가능, But, declare로 선언하지 않아도 동일하게 작동하므로 굳이
타입스크립트에서 선언할 수 있는 타입으로는
네임스페이스
,클래스
,enum
,인터페이스
,타입 별칭
,함수
,변수
이들은 선언할 때 네임스페이스나 타입 또는 값으로 사용될 수 있다.
네임스페이스
⭕️
⭕️
클래스
⭕️
⭕️
enum
⭕️
⭕️
인터페이스
⭕️
타입 별칭
⭕️
함수
⭕️
변수
⭕️
같은 이름의 다른 선언과 병합 가능 여부
네임스페이스
⭕️
⭕️
⭕️
⭕️
⭕️
⭕️
⭕️
클래스
⭕️
❌
❌
⭕️
❌
⭕️
❌
enum
⭕️
❌
⭕️
❌
❌
❌
❌
인터페이스
⭕️
⭕️
❌
⭕️
❌
⭕️
⭕️
타입 별칭
⭕️
❌
❌
❌
❌
⭕️
⭕️
함수
⭕️
⭕️
❌
⭕️
⭕️
⭕️
❌
변수
⭕️
❌
❌
⭕️
⭕️
❌
❌
이 표를 모두 외우는건 쉽지 않기 떄문에 인터페이스, 네임스페이스 병합이나 함수 오버로딩과 같이 널리 알려진 경우를 제외하고는 웬만하면 같은 이름으로 여러번 선언하지 않는 것이 좋다.
선언 병합을 활용하면 좋은 예
클래스의 new 연산자를 사용하지 않고 생성하게 만드는 코드
declare로 앰비언트 선언한 타입도 병합됨
앰비언트 선언한 타입과 그렇지 않은 타입끼리도 병합된다.
함수에 속성이 별도로 있다는걸 알리고 싶은 경우
JS에서 함수도 객체이므로 함수에 속성을 추가할 수 있음
함수와 네임스페이스가 병합될 수 있으므로 아래 코드에서 에러가 발생하지 않음
함수에 속성이 별도로 있다는걸 알리고 싶은 경우 함수와 동일한 이름의 namespac를 추가하면 된다.
Last updated