詳解TypeScript如何正確使用Declare關(guān)鍵字
如果您編寫 TypeScript 代碼的時(shí)間足夠長,您就已經(jīng)看到過declare關(guān)鍵字。但它有什么作用,為什么要使用它?
declare關(guān)鍵字告訴 TypeScript 編譯器存在一個(gè)對象并且可以在代碼中使用。
本文解釋了聲明關(guān)鍵字并通過代碼示例展示了不同的用例。
定義
在 TypeScript 中,declare關(guān)鍵字告訴編譯器存在一個(gè)對象(并且可以在代碼中引用)。它向 TypeScript 編譯器聲明該對象。簡而言之,它允許開發(fā)人員使用在其他地方聲明的對象。
編譯器不會(huì)將此語句編譯為 JavaScript。
開發(fā)人員可能需要使用聲明關(guān)鍵字:
- 使用在另一個(gè)文件中聲明的全局變量。
- 使用另一個(gè)文件生成的函數(shù)、變量或類。
- ETC。
很多時(shí)候,declare關(guān)鍵字用于 TypeScript 聲明文件 ( .d.ts )。
使用聲明關(guān)鍵字,您可以聲明:
- 變量(const、let、var)。
- 類型或接口
- A類
- 一個(gè)枚舉
- 一個(gè)功能
- 一個(gè)模塊
- 命名空間
聲明函數(shù)或類時(shí),您只聲明它們的結(jié)構(gòu),而不是它們的實(shí)現(xiàn)。
具體例子
您想要在 TypeScript 代碼中使用 Google Analytics 腳本。為此,您必須將其包含在 HTML 頁面中。
你可以這樣包含它:
<script?async?src="https://www.googletagmanager.com/gtag/js?id=TAG_ID"></script><script> ??window.dataLayer?=?window.dataLayer?||?[];??function?gtag(){dataLayer.push(arguments)}; ??gtag('js',?new?Date()); ??gtag('config',?'TAG_ID');</script>
dataLayer數(shù)組在 HTML 中聲明。 TypeScript 編譯器不知道它,所以如果你想使用它,你需要聲明它。
以下是聲明方式:
declare?const?dataLayer:?any[];
您現(xiàn)在可以在 TypeScript 代碼中使用dataLayer變量。
使用
通常,TypeScript 代碼需要導(dǎo)入資源,例如圖像或可縮放矢量圖形 (SVG)。
在這些情況下,您必須為每個(gè)模塊創(chuàng)建一個(gè)聲明。
例如,如果我們想在代碼中使用 PNG,我們可以創(chuàng)建如下聲明:
declare?module?'*.png'?{????const?src:?string;????export?default?src;}
在本例中,我們使用通配符模塊聲明,因此我們不必單獨(dú)聲明每個(gè)圖像路徑。
如何聲明全局變量
在聲明文件中輸入變量名稱并鍵入以 聲明全局變量。
這是一個(gè)例子:
declare?var?CPT:?number;
我們現(xiàn)在可以在代碼中使用CPT變量。
如何聲明全局函數(shù)
將函數(shù)定義寫入聲明文件中以聲明全局函數(shù)。
這是一個(gè)例子:
declare?function?sayHello(hello:?string):?void;
現(xiàn)在我們可以在代碼中使用sayHello函數(shù)。
如何聲明一個(gè)類
聲明類時(shí),只需編寫類結(jié)構(gòu),而不編寫每個(gè)函數(shù)的實(shí)現(xiàn)。
這是一個(gè)例子:
declare?class?Animal?{????constructor(name:?string); ????eat():?void; ????sleep():?void;}
我們現(xiàn)在可以在代碼中實(shí)例化Animal類。
如何組織類型和對象
要組織多種類型和對象,您可以聲明以下概念之一:
- 命名空間
- 一個(gè)模塊
在它們內(nèi)部,聲明所有類型、對象、類等。
以下是命名空間聲明的示例:
declare?namespace?AnimalLib?{????class?Animal?{????????constructor(name:?string); ????????eat():?void; ????????sleep():?void; ????} ????type?Animals?=?'Fish'?|?'Dog';}
以下是模塊聲明的示例:
declare?module?AnimalLib?{????class?Animal?{????????constructor(name:?string); ????????eat():?void; ????????sleep():?void; ????} ????type?Animals?=?'Fish'?|?'Dog';}
使用聲明關(guān)鍵字來擴(kuò)充模塊
開發(fā)人員還可以使用聲明關(guān)鍵字來擴(kuò)充模塊。
例如,我們可以向模塊內(nèi)包含的現(xiàn)有接口添加新屬性。
下面是一個(gè)例子:
import?{? ????Palette?as?MuiPallete?}?from?'@mui/material/styles/createPalette'; ??declare?module?'@mui/material/styles/createPalette'?{????interface?Palette?extends?MuiPallete?{ ????????custom:?{ ????????????prop1:?string; ????????} ????}}
在這里,我們從 Material UI 樣式模塊擴(kuò)充Palette 界面并添加自定義對象。
使用聲明關(guān)鍵字將聲明添加到全局范圍
開發(fā)人員還可以使用聲明關(guān)鍵字將聲明添加到全局范圍。
例如,以下是向String JavaScript 對象添加新方法的方法:
declare?global?{????interface?String?{ ????????toSmallString():?string; ????}} ??String.prototype.toSmallString?=?():?string?=>?{????//?implementation. ????return?'';};
在此示例中,我們向String原型添加一個(gè)名為toSmallString的新函數(shù)。
最后的想法
正如您所看到的,當(dāng)使用在其他地方創(chuàng)建的變量時(shí),declare關(guān)鍵字非常有用。
盡管這個(gè)概念并不為人所知,但要成為一名全面的 TypeScript 程序員并能夠幫助您的同行,必須充分理解它。
到此這篇關(guān)于詳解TypeScript如何正確使用Declare關(guān)鍵字的文章就介紹到這了,更多相關(guān)TypeScript Declare內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JS控件bootstrap suggest plugin使用方法詳解
這篇文章主要介紹了JS控件bootstrap suggest plugin的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03JS實(shí)現(xiàn)在Repeater控件中創(chuàng)建可隱藏區(qū)域的代碼
在WEB應(yīng)用中,如何才能使應(yīng)用高效率呢?如何才能吸引用戶呢?這的確是個(gè)大學(xué)問,頁面的內(nèi)容,色搭配等都十分重要。但不可忽視的是,多數(shù)情況下,對于數(shù)據(jù)的呈現(xiàn)方式也是十分重要的。2010-09-09一文詳解如何使npm-scripts更好維護(hù)的配置方法
這篇文章主要為大家介紹了如何使npm-scripts更好維護(hù)的配置方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06layui實(shí)現(xiàn)下拉框三級聯(lián)動(dòng)
這篇文章主要為大家詳細(xì)介紹了layui實(shí)現(xiàn)下拉框三級聯(lián)動(dòng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07javascript文件加載管理簡單實(shí)現(xiàn)方法
這篇文章主要介紹了javascript文件加載管理簡單實(shí)現(xiàn)方法,可實(shí)現(xiàn)順序加載所有js文件的功能,非常簡單實(shí)用,需要的朋友可以參考下2015-07-07