TL;DR
네임 스페이스를 내 보내지 않고 선언하는 것만으로 네임 스페이스 내의 열거 형에 액세스하고 싶습니다. 변환 된 네임 스페이스는 정의되지 않은 객체이므로 네임 스페이스에 액세스 할 수 없으므로 네임 스페이스에 오류가 발생하여 열거 형에 액세스 할 수 없습니다.
설명
TypesScript에서 프로젝트를 설정하고 있는데이 프로젝트와 관련된 모든 정의를 가져 오는 것을 피하고 싶습니다. 이 스 니펫에서는 redux 논리에 대한 로컬 정의를 넣을 네임 스페이스를 만들었습니다.
리덕스 선언의 추출 (redux.d.ts) :
declare namespace Redux {
namespace Actions {
enum TypeKeys {
REDUX_INIT = '@@redux/INIT',
BOOTSTRAP = 'BOOTSTRAP',
CORPUS_LOADED = 'CORPUS_LOADED',
...
}
...
interface Definition {
doSomething(): void;
...
}
...
}
namespace Store {
interface Definition { ... }
...
}
}
내 코드의 정의를 가져 오는 것을 피할 수 있습니다 (예 :
const mapStateToProps = (state: Redux.Store.Definition) => state;
최상위 구성 요소에서는Redux네임 스페이스를 가져올 필요가 없습니다)
문제를 해결하기 위해이 감속기를 썼습니다 (corpusReducer.ts추출) :
// Note: no need to import Redux!
export default (state: Redux.Store.CorpusManagement, action: Redux.Actions.ActionTypes): Redux.Store.CorpusManagement => {
switch (action.type) {
case Redux.Actions.TypeKeys.CORPUS_LOADED:
return { corpus: action.payload };
default:
return state === undefined ? { corpus: { documents: [] } } : state;
}
};
번역 된 후
case Redux.Actions.TypeKeys.CORPUS_LOADED
줄에 대해ReferenceError : Redux가 정의되지 않았습니다오류가 발생합니다.
.
Redux
네임 스페이스이므로 TypeScript 세계에 속하기 때문에 런타임에 사용할 수 없습니다.
TypeKeys
반면에, 그것은 JavaScript로 매핑되어야하는 열거 형이므로, 예상되는 행동은 열거 형이 일단 변환 된 후에도 여전히 액세스 가능하다는 것입니다.
내보내기를 추가하면 (
declare namespace Redux
로 줄 바꾸기)
) 파일이 모듈로 '승격 됨'이지만 코드의 어느 곳에서나 가져와야합니다.
질문
내보내기 절을 피하면서 어떻게 열거 형에 액세스 할 수 있습니까 (따라서 어디서나 모듈을 명시 적으로 가져 오려면)? 내가 따르지 않는 좋은 습관이 있습니까?
- 답변 # 1
관련 자료
- node.js : Typescript는 모듈 'Worker_Threads'를 찾을 수 없습니다.
- angular - typescript에서 속성 이름이 지정된 배열에 액세스
- typescript - 각도 모듈에서 모듈에 내 보낸 멤버 오류가 없습니다
- nodejs 콘솔에서 javascript 파일에 선언 된 변수에 어떻게 액세스 할 수 있습니까?
- vuejs2 - typescript vue 구성 요소 클래스 내에서 라우터 매개 변수에 액세스
- node.js - typescript에서 jest를 사용하여 모의 요청 모듈 기능
- Typescript - 타자기 - 서브 클래스에서 사용자 정의 메소드에 액세스 할 수 없습니다
- angular - 모듈 '""에 이온 3 지리적 위치에서 내 보낸 멤버'NativeGeocoderReverseResult '가 없습니다
- reactjs - Reactjs 및 Typescript를 사용할 때 모듈에 내 보낸 멤버 문제가 없습니다
- 경로가있는 라 라벨 모듈의 뷰에 액세스하는 방법은 무엇입니까?
- javascript - 각도의 typescript 오류 - 선언 된 유형이 'void'도 아니고 'any'도 아닌 함수는 값을 반환해야합니다
- typescript - 모난 - 각도 라이브러리의 componentts 내부에 선언 된 함수에 액세스하는 방법은 무엇입니까?
- javascript - 브라우저 확장 컨텍스트에서 TypeScript를 통해 전역 변수에 액세스하는 방법 (가능한 경우 부분적으로 입력)
- Python Requests module - python 요청 모듈 - 한 번에 여러 url에 액세스
- oop - 템플릿 클래스 A에서 C ++의 템플릿 B 클래스에서 private 필드로 선언 된 구조체에 어떻게 액세스합니까?
- javascript - vue 3 및 typescript - 메서드의 데이터에 액세스 할 수 없습니다
- c++ - 내 클래스가 다른 개체의 비공개 적으로 선언 된 변수에 액세스 할 수없는 이유
- 모듈에 Angular에 내 보낸 멤버 'CanActivate'가 없습니다
- TS2306은 typescript 파일의 모듈 오류가 아닙니다
- javascript - 모듈 방식에 대한 내부 참조와 내 보낸 참조
- OpenCv의 폴더에서 여러 이미지 읽기 (python)
- 파이썬 셀레늄 모든 "href"속성 가져 오기
- html - 자바 스크립트 - 클릭 후 변경 버튼 텍스트 변경
- javascript - 현재 URL에서 특정 div 만 새로 고침/새로 고침
- JSP에 대한 클래스를 컴파일 할 수 없습니다
- JavaScript 변수를 HTML div에 '출력'하는 방법
- git commit - 자식 - 로컬 커밋 된 파일에 대한 변경을 취소하는 방법
- jquery - JavaScript로 현재 세션 값을 얻으시겠습니까?
- javascript - swiperjs에서 정지, 재생 버튼 추가
- python - 화면에서 찾은 요소를 찾을 수없는 경우 셀레늄
Enum은 열거 형 객체를 사용하여 런타임에 값을 보유합니다. 즉,이 개체에 액세스 할 수없는 경우 개체의 존재 여부에 따른 코드가 검색에 실패합니다.
가장 좋은 해결책은 객체를 내보내는 것입니다. 열거 형을 보유하는 추가 모듈을 추가하고 가져옵니다.
이것이 가능하지 않다면 선언에 const enum을 사용할 수 있습니다. Const 열거 형은 컴파일러가 열거 형 값에 대한 참조를 발견 할 때마다 실제 값이 생성 된 JS에 하드 코딩되므로 오브젝트의 존재에 의존하지 않습니다.이 접근 방식은 모든 값이 JS에 하드 코딩되어 있고 열거 형을 변경하면 열거 형을 참조하는 코드를 다시 작성해야 함을 의미하므로주의해야합니다.
수정
나에게 맞는 전체 코드 :
출력 :