1

@types/hapi에 의존하는 노드 응용 프로그램이 있습니다. 이 모듈에 정의 된 클래스 중 하나에 속성을 추가하고 싶습니다.모듈 확대를 통해 기존 TypeScript 인터페이스에 속성을 추가해도 영향이 없음

// my-custom-hapi-typings.d.ts 
import * as hapi from 'hapi'; 

declare module hapi { 
    interface Server { 
     myProperty: string; 
    } 
} 

이 어떤 컴파일러 오류가 발생하지 않습니다, 그러나 또한 Server 클래스에 myProperty 속성을 추가하지 않습니다 나는 모듈 확대를 통해 나의 새로운 속성을 정의하는 시도했습니다.

// my-other-file.ts 
import * as hapi from 'hapi'; 

const server = new hapi.Server({ ... }); 

// error: Property 'myProperty' does not exist on type 'Server'. 
server.myProperty = 'hello'; 

왜 타이프 스크립트 컴파일러 내 .d.ts 파일을 무시하는 것처럼 보인다 : 나는 시도하고 다음과 같은 속성을 참조 할 때 나는 아직도 다른 곳에서 내 프로젝트의 오류를 얻을? 파일을 "가져올"필요가 있거나이 파일이 존재한다는 것을 TypeScript 컴파일러가 인식하도록해야합니까? 나는 입력 소스 디렉토리에 .d.ts 파일을 두는 것만으로도이 보강 작업을 수행하기에 충분했습니다.

+0

최상위 '가져 오기'는 파일을 모듈로 만듭니다. 제거해보십시오. – Aaron

+0

@Aaron, 응답 주셔서 감사하지만 방금 최상위 수준의 '가져 오기'제거하고 그 결과는 동일합니다. –

+1

"hapi"를 따옴표로 묶어보십시오 :'declare module "hapi"'. 'Server' 인터페이스를'export '해야 할 수도 있습니다. – Aaron

답변

1

이 당신의 문제입니다 :

declare module hapi { 

이 실제로 사용 전 날짜 ES6 모듈이 "내부 모듈"라고하는 오래된 구문을 사용하여 namespace을 정의한다. module hapi을 쓰는 것은 오늘 바람직한 문법 인 namespace hapi을 쓰는 것과 같습니다. More on namespaces vs modules here.

declare an external module에 당신은 따옴표로 모듈 이름을 추가해야한다

[...] 네임 스페이스를 주변과 비슷한 구조를 사용하지만, 우리는 module 키워드와 인용 된 이름의를 사용 나중에 가져올 수있는 모듈

이 (my-custom-hapi-typings.d.ts 직접 수입 할 필요가 없습니다)를 주변 외부 모듈 정의 (무엇을 import "hapi"를 선언 이제
declare module "hapi" 

이있다 : 즉

, 그냥 따옴표로 hapi를 넣어 당신을 준다), 당신은 그 안에 선언 된 것을 보강 할 수있다.

module hapimodule "hapi"in the Playground을 통해 마우스를 사용하면 툴팁의 차이를 볼 경우 enter image description here

enter image description here 네, 그 뒤에 역사로 인해 미묘하고 복잡합니다.

+0

@Aaron에 대한 철저한 설명에 감사드립니다.내가해야 할 유일한 변화는 "hapi"를 따옴표로 묶는 것이 었습니다. 'import' 문을 지우면 내 선언은 * hapi 모듈 정의를 덮어 쓰는 대신에 * hapi 모듈 정의를 덮어 쓰는 것처럼 보입니다 * 액세스 할 수있는 유일한 속성은 내가 정의한 것입니다. 그래서 나는 '수입'진술이 증강에 필요하다고 생각한다. –

+1

@ NathanFriend 흠, 네 말이 맞아. 실제로 모듈을 만드는 최상위 "내보내기"라고 생각하거나 실제로 모듈을 선언한다고해서'declare module "hapi"의 효과가 실제로 변경되지는 않습니다. 또한 모듈 선언 내에서 가져올 수도 있습니다. 나는 나의 대답을 편집 할 것이다 ...이 대답이 누군가를 속일 수 있기를 원하지 않는다. :) – Aaron