programing

TypeScript에서 가져온 유형의 주변 선언

prostudy 2022. 3. 17. 00:52
반응형

TypeScript에서 가져온 유형의 주변 선언

내 TypeScript 프로젝트에 다음과 같은 선언 파일이 있다.

// myapp.d.ts
declare namespace MyApp {
  interface MyThing {
    prop1: string
    prop2: number
  }
}

이것은 아주 잘 작동하고 나는 이 네임스페이스를 가져올 필요 없이 내 프로젝트의 어느 곳에서나 사용할 수 있다.

이제 타사 모듈에서 유형을 가져와 주변 선언에 사용해야 함:

// myapp.d.ts
import {SomeType} from 'module'

declare namespace MyApp {
  interface MyThing {
    prop1: string
    prop2: number
    prop3: SomeType
  }
}

컴파일러는 이제 네임스페이스 'MyApp'을 찾을 수 없다고 불평하는데, 아마도 가져오기로 인해 주변 환경이 차단되었기 때문일 것이다.

제3자 유형을 사용하는 동안 선언서의 주변 요소를 유지하는 쉬운 방법이 있는가?

그래, 방법이 있어.typeScript 2.9에서는 import() 유형을 사용함으로써 쉬워졌지만 이전 버전의 TypeScript에서도 가능하다.

다음 파일은 스크립트 입니다.스크립트로 선언된 내용이 글로벌 범위에 추가된다.이것이 당신이 사용할 수 있는 이유다.MyApp.MyThing가져오지 않고

// myapp.d.ts
declare namespace MyApp {
  interface MyThing {
    prop1: string;
    prop2: number;
  }
}

스크립트는 가져올 수 없다는 점에서 제한되며, 추가 시import, 스크립트는 모듈이 된다.아무리 말해도 이상하다고 생각하지만 그게 바로 그거야.중요한 것은 모듈에서 정의한 사물이 그 모듈로 범위가 지정되고, 글로벌 범위에 추가되지 않는다는 것이다.

그러나 모듈은 선언문을 안에 넣어 글로벌 범위에도 추가할 수 있다.global:

// myapp.d.ts
import {SomeType} from 'module';

declare global {
  namespace MyApp {
    interface MyThing {
      prop1: string;
      prop2: number;
      prop3: SomeType;
    }
  }
}

이 파일은 모듈이지만 다음과 같은 선언이 추가된다.MyApp.MyThing계속 사용할 수 있도록 글로벌 범위까지MyApp.MyThing가져오지 않은 다른 TypeScript 코드로.

참고:.d.ts확장은 인터페이스를 가져오지 않고도 인터페이스에 액세스할 수 있는 것과 관련이 없다.위의 파일 두 개 모두.ts그리고 여전히 똑같이 행동할 것이다.

TS 2.9는 다음과 같이 가능하다.import():

// myapp.d.ts
declare type SomeType = import('module').SomeType;
declare type SomeDefaultType = import('module-with-default-export').default;


declare namespace MyApp {
  interface MyThing {
    prop1: string;
    prop2: number;
    prop3: SomeType | SomeDefaultType;
  }
}

여전히 답을 찾고 있는지 모르겠지만, 이것이 올바른 처리 방법이며, 예를 들어, 네임스페이스가 아닌 일반 모듈을 정의할 수 있는 방법: (원문 답안은 질문에 기반함)

// myapp.d.ts

declare namespace MyApp {
  import {SomeType} from 'module'
  interface MyThing {
    prop1: string
    prop2: number
    prop3: SomeType
  }
}

불행히도, 아니다.이미 알아낸 바와 같이, 이것은 예를 들어 외부 의존성이 없는 내부 코드에서만 작동한다.네임스페이스를 내보내거나 클래스를 내보내거나 ES6 모듈을 사용하십시오.하지만 두 가지 모두 당신이 필요로 하는 결과를 초래할 것이다.import네 이 피하려고 내가 믿는 바로는 네가 피하려고 하는 것 말이야.

개인적으로, 나는 수입품(짝퉁 내적인 것까지)을 코드 전체에 실제로 사용하는 것이 더 위안이 된다.이는 특정 파일(클래스)을 열 때 모든 종속성을 즉시 볼 수 있는 간단한 이유 때문이다.

"TypeScript에서 가져오기로 네임스페이스를 사용하는 방법"이라는 질문에서는 이미 철저한 예가 제시되어 있었다.

다른 사람들을 위한 참고 사항: "내부적으로 사용할 수 있는 네임스페이스" 또한 내가 이것을 중복된 질문으로 고려하지 않는 이유다.

참조URL: https://stackoverflow.com/questions/45099605/ambient-declaration-with-an-imported-type-in-typescript

반응형