declare
성명서에 왜 우리가 필요 합니까?
export declare class Actions {
...
}
답변
내가 찾던 것을 찾았습니다.
선언 대 var
var
새로운 변수를 만듭니다. declare
변수가 다른 곳에 생성되었음을 TypeScript에 알리는 데 사용됩니다. 를 사용하면 declare
생성 된 JavaScript에 아무것도 추가되지 않습니다. 이는 컴파일러에 대한 힌트 일뿐입니다.
예를 들어을 정의하는 외부 스크립트를 사용하는 경우 이미 설정된 TypeScript 컴파일러를 암시하는 데 var externalModule
사용 합니다declare var externalModule
externalModule
답변
이를 이해하려면 먼저 “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
타이프 스크립트에서 :
declare
typescript 의 키워드는 선언 이 다른 곳 (외부 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 패키지가 수행하므로 그 이유는) 열거 형은 인라인되지 않습니다! 당신은 그것을 실행할 수 있습니다, 당신은하지 않을 수 있지만, 미리 알고있는 것이 유용합니다!