TypeScript에서 전역 변수 만들기
JavaScript에서는 다음과 같이 할 수 있습니다.
something = 'testing';
그리고 다른 파일에서 :
if (something === 'testing')
something
(올바른 순서로 호출되는 한) 정의 될 것 입니다.
TypeScript에서 수행하는 방법을 알아낼 수없는 것 같습니다.
이것이 내가 시도한 것입니다.
.d.ts 파일에서 :
interface Window { something: string; }
그런 다음 내 main.ts 파일에서 :
window.something = 'testing';
그런 다음 다른 파일에서 :
if (window.something === 'testing')
그리고 이것은 작동합니다. 그러나 나는 window.
그것 의 일부 를 잃고 단지 내가 something
글로벌 이 되기를 원합니다 . TypeScript에서 수행하는 방법이 있습니까?
(관심이있는 사람이있는 경우 애플리케이션에 대한 로깅을 설정하려고 log.Debug
합니다. 개체를 가져 와서 만들지 않고도 모든 파일에서 호출 할 수 있기를 원합니다 .)
좋아요, 이건 당신이했던 것보다 더 못 생겼 겠지만 어쨌든 ...
하지만 나도 똑같이 ...
순수한 TypeScript에서 할 수있는 일은 다음 eval
과 같은 함수 를 사용하는 것입니다.
declare var something: string;
eval("something = 'testing';")
그리고 나중에 할 수 있습니다
if (something === 'testing')
이것은 TypeScript가 컴파일을 거부하지 않고 명령을 강제 실행하는 해킹 declare var
에 지나지 않으며 TypeScript가 나머지 코드를 컴파일하도록합니다.
.d.ts
정의 파일 내부
type MyGlobalFunctionType = (name: string) => void
브라우저에서 작업하는 경우 브라우저의 창 컨텍스트에 멤버를 추가합니다.
interface Window {
myGlobalFunction: MyGlobalFunctionType
}
NodeJS에 대한 동일한 아이디어 :
declare module NodeJS {
interface Global {
myGlobalFunction: MyGlobalFunctionType
}
}
이제 루트 변수를 선언합니다 (실제로 창 또는 전역에 있음).
declare const myGlobalFunction: MyGlobalFunctionType;
그런 다음 일반 .ts
파일에서 부작용으로 가져 오면 실제로 구현합니다.
global/* or window */.myGlobalFunction = function (name: string) {
console.log("Hey !", name);
};
마지막으로 다음 중 하나를 사용하여 코드베이스의 다른 곳에서 사용합니다.
global/* or window */.myGlobalFunction("Kevin");
myGlobalFunction("Kevin");
TypeScript와 결합 된 JavaScript를 사용하면 작동하는 방법을 찾았습니다.
logging.d.ts :
declare var log: log4javascript.Logger;
로그 선언. js :
log = null;
initalize-app.ts
import './log-declaration.js';
// Call stuff to actually setup log.
// Similar to this:
log = functionToSetupLog();
이것은 그것을 전역 범위에 놓고 TypeScript는 그것에 대해 알고 있습니다. 그래서 모든 파일에서 사용할 수 있습니다.
참고 : allowJs
TypeScript 옵션을 true로 설정 했기 때문에 이것이 작동한다고 생각 합니다.
누군가 순수한 TypeScript 솔루션을 게시하면 동의합니다.
이것 만 사용하는 메신저
import {globalVar} from "./globals";
declare let window:any;
window.globalVar = globalVar;
global 이것은 미래입니다.
// Way 1
var abc: number
globalThis.abc = 200 // no error
// Way2
declare var age: number
globalThis.age = 18 // no error
참고 : 위의 코드가 포함 된 파일은 어떤
import
문도 가질 수 없습니다 .
지금까지 이것이 내가 전역 객체를 확장하기 위해 알아 낸 방법입니다.
모든 마법은 var
. 교체 var
와 함께 let
또는 const
작동하지 않습니다.
나는 모듈을 확장하는 노력
globalThis
에 의해 선언-병합 했지만 실패했습니다.
이것은 내가 그것을 고친 방법입니다.
단계 :
다음과 같이 custom.d.ts와 같은 전역 네임 스페이스를 선언했습니다.
declare global { namespace NodeJS { interface Global { Config: {} } } } export default global;
Map the above created a file into "tsconfig.json" as below:
"typeRoots": ["src/types/custom.d.ts" ]
Get the above created global variable in any of the files as below:
console.log(global.config)
Note:
typescript version: "3.0.1".
In my case, the requirement was to set the global variable before boots up the application and the variable should access throughout the dependent objects so that we can get the required config properties.
Hope this helps!
Thank you
As an addon to Dima V's answer this is what I did to make this work for me.
// First declare the window global outside the class
declare let window: any;
// Inside the required class method
let globVarName = window.globVarName;
I spent couple hours to figure out proper way to do it. In my case I'm trying to define global "log" variable so the steps were:
1) configure your tsconfig.json
to include your defined types (src/types
folder, node_modules - is up to you):
...other stuff...
"paths": {
"*": ["node_modules/*", "src/types/*"]
}
2) create file src/types/global.d.ts
with following content (no imports! - this is important), feel free to change any
to match your needs + use window
interface instead of NodeJS
if you are working with browser:
/**
* IMPORTANT - do not use imports in this file!
* It will break global definition.
*/
declare namespace NodeJS {
export interface Global {
log: any;
}
}
declare var log: any;
3) now you can finally use/implement log
where its needed:
// in one file
global.log = someCoolLogger();
// in another file
log.info('hello world');
// or if its a variable
global.log = 'INFO'
참고URL : https://stackoverflow.com/questions/38906359/create-a-global-variable-in-typescript
'developer tip' 카테고리의 다른 글
ELF 파일 형식에서 섹션과 세그먼트의 차이점은 무엇입니까 (0) | 2020.12.05 |
---|---|
Rails 3 인증 솔루션 (0) | 2020.12.05 |
Javac 디버그 설정과 해제간에 성능 차이가 있습니까? (0) | 2020.12.05 |
런타임시 JVM 힙 크기 설정 (0) | 2020.12.05 |
Vuejs 및 Vue.set (), 배열 업데이트 (0) | 2020.12.04 |