最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解如何在TypeScript中聲明全局變量

 更新時(shí)間:2023年08月11日 11:47:42   作者:zhangbao90s  
本文主要介紹了如何在 TypeScript 中聲明全局變量,在TypeScript中,可以使用declare關(guān)鍵字來聲明全局變量,這樣的聲明告訴編譯器該變量是在其他地方定義的,而不需要實(shí)際的實(shí)現(xiàn),文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下

有時(shí)候,你可能想在 TypeScript 使用一些自定義全局變量。例如,在我的一些 Web 應(yīng)用程序中,我需要將一些從服務(wù)器端渲染時(shí)傳遞過來的屬性給在瀏覽器中運(yùn)行的 JavaScript 代碼使用。為了做到這一點(diǎn),通常我會(huì)在內(nèi)聯(lián)腳本中定義一個(gè)名為 __INITIAL_DATA__ 的全局變量,并將一個(gè) JSON 序列化對(duì)象賦值給它:

<script>
  window.__INITIAL_DATA__ = {
    userID: "536891193569405430",
  };
</script>

現(xiàn)在,如果我嘗試在一個(gè) TypeScript 文件中訪問 window.__INITIAL_DATA__ 時(shí),編譯器就會(huì)產(chǎn)生一個(gè)類型錯(cuò)誤,因?yàn)樗也坏?__INITIAL_DATA__ 屬性的定義。

// Property '__INITIAL_DATA__' does not exist
// on type 'Window & typeof globalThis'
const initialData = window.__INITIAL_DATA__;

接下來,我將向你展示幾種不同的方法,讓 TypeScript 知道 window.__INITIAL_DATA__ 屬性的存在,并消除類型錯(cuò)誤。

使用類型斷言

消除類型錯(cuò)誤的最快方法是在類型斷言中使用 any 類型。我們可以將 window 對(duì)象視為任意類型,以便訪問其 __INITIAL_DATA__ 屬性:

const initialData = (window as any).__INITIAL_DATA__;

這個(gè)解決方案有效,我們不再遇到類型錯(cuò)誤。如果你需要一種臨時(shí)的方式來訪問 TypeScript 不知道的 window 對(duì)象上的屬性,這是一個(gè)實(shí)用的方法。

(window as any).__INITIAL_DATA__ 表達(dá)式是任意類型,因此 initialData 也是任意類型。我們可以進(jìn)一步使用另一種類型斷言來給 initialData 變量指定更具體的類型:

type InitialData = {
  userID: string;
};
const initialData = (window as any).__INITIAL_DATA__ as InitialData;

現(xiàn)在,我們可以以類型安全的方式訪問 initialData.userID

const userID = initialData.userID; // string 類型 

請(qǐng)記住,這并不保證 window.__INITIAL_DATA__ 在運(yùn)行時(shí)會(huì)被正確設(shè)置。類型檢查器相信我們,并且我們的工作是確保將一個(gè)符合預(yù)期形狀的對(duì)象賦值給 window.__INITIAL_DATA__

聲明一個(gè)全局變量

另一種方法是使用 declare var 語(yǔ)法聲明一個(gè)全局變量。這樣,我們可以讓 TypeScript 找到這個(gè)具有給定名稱和類型的全局變量:

declare var __INITIAL_DATA__: InitialData; 

我們現(xiàn)在可以直接訪問 __INITIAL_DATA__ 變量了……

const initialData = __INITIAL_DATA__; 

……或通過 window 對(duì)象獲?。?/p>

const initialData = window.__INITIAL_DATA__; 

有一點(diǎn)要注意的是,在ECMAScript模塊內(nèi)部通過 declare var 聲明的變量是是無法通過 window.__INITIAL_DATA__ 形式訪問的,會(huì)收到類型錯(cuò)誤。而所謂 ECMAScript 模塊就是包含頂級(jí) import export 聲明的那些文件。

你可以使用 declare global { ... } 語(yǔ)法在全局作用域中聲明一個(gè)全局變量,以便能夠在 JavaScript 模塊內(nèi)部或外部文件通過 window.__INITIAL_DATA__ __INITIAL_DATA__ 兩種形式訪問。

export function someExportedFunction() {
  // ...
}
declare global {
  var __INITIAL_DATA__: InitialData;
}
const initialData = window.__INITIAL_DATA__;

如果你需要在多個(gè)文件或模塊中訪問 window.__INITIAL_DATA__ ,那么在項(xiàng)目中創(chuàng)建一個(gè) globals.d.ts 文件可能是個(gè)好主意。在這個(gè)文件中,你可以聲明所有將要使用的全局變量:

declare var __INITIAL_DATA__: InitialData; 

增強(qiáng) Window 接口

最后,你可以使用TypeScript 的接口聲明合并來告訴編譯器在 Window 類型上有一個(gè)名為 __INITIAL_DATA__ 的屬性。為了做到這一點(diǎn),你需要定義一個(gè)名為 Window 的接口,設(shè)置一個(gè)名為 __INITIAL_DATA__ 的屬性:

interface Window {
  __INITIAL_DATA__: InitialData;
}

TypeScript 將會(huì)上面的這個(gè)接口定義和 lib.dom.d.ts 中定義的 Window 接口合并,從而得到一個(gè)單一的 Window 類型。這樣一來,下面的賦值就不再產(chǎn)生類型錯(cuò)誤了:

const initialData = window.__INITIAL_DATA__; 

請(qǐng)注意,這種方法同樣 ECMAScript 模塊中不起作用。為了使 window.__INITIAL_DATA__ 表達(dá)式能夠正確進(jìn)行類型檢查,需要再次使用 declare global { ... } 語(yǔ)法:

export function someExportedFunction() {
  // ...
}
declare global {
  interface Window {
    __INITIAL_DATA__: InitialData;
  }
}
const initialData = window.__INITIAL_DATA__;

以上就是詳解如何在TypeScript中聲明全局變量的詳細(xì)內(nèi)容,更多關(guān)于TypeScript聲明全局變量的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 微信小程序?qū)W習(xí)筆記之文件上傳、下載操作圖文詳解

    微信小程序?qū)W習(xí)筆記之文件上傳、下載操作圖文詳解

    這篇文章主要介紹了微信小程序?qū)W習(xí)筆記之文件上傳、下載操作,結(jié)合實(shí)例形式分析了微信小程序圖片文件傳輸?shù)脑怼⒉襟E及后臺(tái)php操作相關(guān)實(shí)現(xiàn)技巧,并結(jié)合圖文形式予以詳細(xì)說明,需要的朋友可以參考下
    2019-03-03
  • Next.js腳手架完整搭建封裝的方法步驟

    Next.js腳手架完整搭建封裝的方法步驟

    本文主要介紹了Next.js腳手架完整搭建封裝的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • JS 獲取滾動(dòng)條高度示例代碼

    JS 獲取滾動(dòng)條高度示例代碼

    滾動(dòng)條高度如何獲取,方法有很多,在本文將為大家詳細(xì)介紹下如何使用js做到,下面有個(gè)不錯(cuò)的示例,感興趣的朋友不要錯(cuò)過
    2013-10-10
  • JavaScript求解最長(zhǎng)回文子串的方法分享

    JavaScript求解最長(zhǎng)回文子串的方法分享

    這篇文章主要為大家介紹了JavaScript求解最長(zhǎng)回文子串的幾種方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-08-08
  • JS前后端實(shí)現(xiàn)身份證號(hào)驗(yàn)證代碼解析

    JS前后端實(shí)現(xiàn)身份證號(hào)驗(yàn)證代碼解析

    這篇文章主要介紹了JS前后端實(shí)現(xiàn)身份證號(hào)驗(yàn)證代碼解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • JavaScript中textRange對(duì)象使用方法小結(jié)

    JavaScript中textRange對(duì)象使用方法小結(jié)

    這篇文章主要介紹了JavaScript中textRange對(duì)象使用方法小結(jié),需要的朋友可以參考下
    2015-03-03
  • weakMap為什么是弱引用原理

    weakMap為什么是弱引用原理

    這篇文章主要為大家介紹了weakMap為什么是弱引用原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • js實(shí)現(xiàn)年月日表單三級(jí)聯(lián)動(dòng)

    js實(shí)現(xiàn)年月日表單三級(jí)聯(lián)動(dòng)

    這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)年月日表單三級(jí)聯(lián)動(dòng),生日欄表單三級(jí)聯(lián)動(dòng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • JS防抖和節(jié)流實(shí)例解析

    JS防抖和節(jié)流實(shí)例解析

    這篇文章主要介紹了JS防抖和節(jié)流實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • confirm確認(rèn)對(duì)話框的實(shí)現(xiàn)方法總結(jié)

    confirm確認(rèn)對(duì)話框的實(shí)現(xiàn)方法總結(jié)

    下面小編就為大家?guī)硪黄猚onfirm確認(rèn)對(duì)話框的實(shí)現(xiàn)方法總結(jié)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-06-06

最新評(píng)論

贞丰县| 三江| 宁国市| 临武县| 儋州市| 昭觉县| 昭觉县| 康定县| 淮安市| 密山市| 丰原市| 鄱阳县| 罗江县| 彭州市| 灯塔市| 长岛县| 克拉玛依市| 介休市| 天津市| 始兴县| 大新县| 无棣县| 金门县| 纳雍县| 邢台市| 瓦房店市| 正定县| 简阳市| 临江市| 云和县| 莎车县| 沂源县| 阳高县| 莱州市| 万载县| 龙门县| 精河县| 安徽省| 西乌珠穆沁旗| 桦甸市| 陵水|