2016-08-11 133 views
20

在javascript中我可以做到這一點創建一個全局變量在打字稿

if (something === 'testing') 

,這將有something定義(只要它們是按正確順序調用)。

我似乎無法弄清楚如何在打字稿中做到這一點。

這是我試過的。

在.d.ts文件:

interface Window { something: string; } 

然後在我的main.ts文件:

window.something = 'testing'; 

然後在另一個文件:

if (window.something === 'testing') 

而這個作品。但是我希望能夠失去window.的一部分,只需要我的something成爲全球性的。在Typescript中有沒有辦法做到這一點?

(如果有人有興趣,我真的想設置我的日誌我的申請,我希望能夠從任何文件log.Debug,而無需導入和創建對象。)

回答

5

好了,所以這可能是連ugglier,你做了什麼,但無論如何...

但我不一樣的,所以...

,你能做些什麼來做到這一點在純打字稿,是使用eval功能,像這樣:

declare var something: string; 
eval("something = 'testing';") 

,以後你就可以做

if (something === 'testing') 

這是沒有什麼比黑客強制執行指令而沒有打字稿拒絕編譯,我們declare var for typecript來編譯其餘的代碼。

+0

我更喜歡這個,因爲我不必打開allowjs。 – Vaccano

+5

@Downvoters請考慮添加評論,解釋downvote的原因 – tforgione

+0

不需要生氣,我們不在Facebook或Youtube上。我說這種方法很醜,OP要求避免有一個.js文件和.ts文件,據我所知,這是唯一可行的方法。你知道另一個嗎? – tforgione

6

我發現如果我使用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(); 

這使得它在全球範圍內和打字稿知道。所以我可以在我的所有文件中使用它。

注:我認爲這隻適用,因爲我的allowJs typescript選項設置爲true。

如果有人發佈純打印解決方案,我會接受。

+0

在你initalize-app.ts文件,您可以使用:'聲明VAR日誌:任;' 那麼你不需要有d.ts文件或js文件。你也可以用實際的類型或接口定義替換它。 – mattferderer

-4

只要寫var something = "testing";

+0

我試過了。它在一個文件中可用,但不在其他文件中。即使我通過Typescript抱怨不知道「something」是什麼(在第二個文件中),它的值不會保留在文件之間。 – Vaccano

7

裏面一個.d.ts定義文件

type MyGlobalFunctionType = (name: string) => void 

如果您在瀏覽器中運行, 將成員添加到瀏覽器的窗口背景:

interface Window { 
    myGlobalFunction: MyGlobalFunctionType 
} 

同樣想法的NodeJS:

declare module NodeJS { 
    interface Global { 
    myGlobalFunction: MyGlobalFunctionType 
    } 
} 

現在你聲明根變量(即將ac tually住在窗口或全球)

declare const myGlobalFunction: MyGlobalFunctionType; 
在常規 .ts文件

然後,但進口的副作用,實際上實現它:

global/* or window */.myGlobalFunction = function (name: string) { 
    console.log("Hey !", name); 
}; 

終於在代碼庫中的其他地方使用它,用或者:

global/* or window */.myGlobalFunction("Kevin"); 

myGlobalFunction("Kevin"); 
+0

這絕對應該是被接受的答案。乾杯@ benoit-b! –

+0

(只是做一個合格的評論)談論很多工作來創建一個簡單的全局變量!大聲笑 – Pytth

+0

@Benoit我沒有得到那部分說「但導入爲副作用」。你是什​​麼意思?。我試過這樣做,但它不適合我,你能分享一個源代碼示例嗎? – BernalCarlos

3

我只是用這個

import {globalVar} from "./globals"; 
declare let window:any; 
window.globalVar = globalVar; 
0

作爲Dima V的回答,這是我做了這個工作對我來說。

// First declare the window global outside the class

declare let window: any;

// Inside the required class method

let globVarName = window.globVarName;