[typescript] ‘익스포트 클래스 액션 내보내기’에서 ‘declare’는 무엇을합니까?

declare성명서에 왜 우리가 필요 합니까?

export declare class Actions {
    ...
}



답변

내가 찾던 것을 찾았습니다.

선언 대 var

var새로운 변수를 만듭니다. declare변수가 다른 곳에 생성되었음을 TypeScript에 알리는 데 사용됩니다. 를 사용하면 declare생성 된 JavaScript에 아무것도 추가되지 않습니다. 이는 컴파일러에 대한 힌트 일뿐입니다.

예를 들어을 정의하는 외부 스크립트를 사용하는 경우 이미 설정된 TypeScript 컴파일러를 암시하는 데 var externalModule사용 합니다declare var externalModuleexternalModule


답변

이를 이해하려면 먼저 “declare”키워드를 이해해야합니다.

Gil Fink의 블로그 에서 좋은 설명이 있습니다 .

TypeScript 선언 키워드는 TypeScript 파일에서 생성되지 않은 변수를 선언하는 데 사용됩니다.

예를 들어, TypeScript 선언 파일이없고 전역 네임 스페이스에 myLibrary라는 네임 스페이스가있는 myLibrary라는 라이브러리가 있다고 가정합니다. TypeScript 코드에서 해당 라이브러리를 사용하려는 경우 다음 코드를 사용할 수 있습니다.

declare var myLibrary;

TypeScript 런타임이 myLibrary 변수에 제공하는 유형은 모든 유형입니다. 여기서 문제는 디자인 타임에 해당 변수에 대한 Intellisense가 없지만 코드에서 라이브러리를 사용할 수 있다는 것입니다. 선언 키워드를 사용하지 않고 동일한 동작을하는 또 다른 옵션은 모든 유형의 변수를 사용하는 것입니다.

var myLibrary: any;

두 코드 예제는 모두 동일한 JavaScript 출력을 생성하지만 선언 예제는 더 읽기 쉽고 주변 선언을 표현합니다.


“declare”키워드를 이해 한 후에는

export declare class Action{
...
}

클래스의 실제 구현은 아마도 .js 파일 일 수 있습니다.


답변

declare 타이프 스크립트에서 :

declaretypescript 의 키워드는 선언 이 다른 곳 (외부 javascript 파일 또는 런타임 환경의 일부에 작성 됨)에 정의되어 있음을 typescript 컴파일러에 알리는 데 유용합니다 .

foo라는 변수가 다른 곳에 선언되어 있다고 가정 해 봅시다. 그런 다음 변수를 참조하려고하면 형식 스크립트 컴파일러에서 오류가 발생합니다.

foo = 'random'; // Error: 'foo' is not defined

declare키워드를 사용하여이 문제를 해결할 수 있습니다 .

declare var foo: string;
foo = 'random';  // no error anymore

이는 다음과 같은 결과를 초래합니다.

  • foo실제로 다른 곳 선언, 우리는 런타임 오류가 발생할 수있는 변수를 사용하려고하지 않습니다. declare이 시점에서 변수를 사용할 수 있다는 것을 알고있는 경우 에만 키워드를 사용하십시오 .
  • 우리는 유형을 알고 있기 때문에 (잠재적으로) IDE Intellisense에 액세스 할 수 있습니다 .
  • 타입을 알고 있기 때문에 타입 스크립트 컴파일러는 컴파일 타임에 타입을 검사 할 수 있으며 , 특정 시나리오에서 잘못된 타입을 사용하고 있다면 경고 할 수 있습니다.

답변

이 특정한 경우 의 선언 키워드 :

export declare class Actions {
    ...
}

… 분명히 쓸모가 없으며 TypeScript 에서이 오류를 고려해야한다고 생각합니다 (숨겨진 이유가 있는지 모르겠습니다). 클래스를 선언하면 클래스를 가져올 필요가 없습니다. 누군가 가져 오기를 기대하는 클래스를 내 보내면 선언 할 필요가 없습니다. 그리고이 클래스를 선언하고 있기 때문에 정의에 따라이 클래스를 가져올 필요없이 사용할 수 있어야합니다. 그러나 클래스 를 내보낼 때 이것은 사실이 아닙니다 . 당신은 필요 사용하도록 가져올 수 있습니다.

TL; DR

export declare class Actions {
    ...
}

와 같다

declare class Actions {
    ...
}


답변

declare -가져 오기 또는 내보내기 키워드없이-TypeScript에 의해 자동으로 선택된 선언 파일을 정의합니다.이 파일은 레거시 모듈 (TypeScript 정의가없는 npm 설치 패키지)에 입력을 추가하는 데 유용한 기능입니다.

import/ export는 모듈을 사용하는 올바른 방법이며 모든 것은 수동으로 가져와야하고 논리와 정의 중 하나를 가져와야합니다.

실제 사용 사례로 다음과 같은 export declare모든 하위 요소를 내 보내지 않아도됩니다.

export declare namespace Redux {
    namespace Store {
        interface Definition { ... }
    }
}

다음보다 읽기 쉽습니다.

export namespace Redux {
    export namespace Store {
        export interface Definition { ... }
    }
}

외부 수입품은 두 경우 모두 동일합니다 (예 🙂 import { Redux } from 'definitions/redux';, 그것이 좋은 습관인지 아닌지는 모르겠지만 깔끔합니다! ^^

import또는 export파일에 파일 을 추가하면 해당 파일이 모듈로 승격되므로 declare범위가 더 이상 전역 수준이 아님 을 명심 해야합니다 .

추신 : 버그가 있습니다 ( 문제 16671 ) : const enum선언에 사용 하고 ( 리두 작업 유형에 대해 수행) transpileOnly플래그 를 지정하면 ( create-react-app-typescript 패키지가 수행하므로 그 이유는) 열거 형은 인라인되지 않습니다! 당신은 그것을 실행할 수 있습니다, 당신은하지 않을 수 있지만, 미리 알고있는 것이 유용합니다!


답변