Typescript裝飾器AOP示例詳解
在Typescript中使用裝飾器
上文中講了裝飾模式,今天來(lái)來(lái)介紹一些Typescript里面的裝飾器,以及如何用裝飾器來(lái)實(shí)現(xiàn)之前提及裝飾模式,裝飾器只是實(shí)現(xiàn)裝飾模式的一種方式,并非唯一
配置
在Typescript要使用裝飾器需要在tsconfig打開(kāi)裝飾器的語(yǔ)法
"compilerOptions": { "experimentalDecorators": true }
類(lèi)裝飾器
在Typescript中我們可以對(duì)一個(gè)class用裝飾器進(jìn)行拓展,比如下面的例子, 會(huì)打印出'target is class A'的log日志;
const injectable = () => (target: { new (...args: any[]): {} }) => { console.log('target is ',target) }; @injectable() class A {}
在類(lèi)裝飾器中我們可以獲取到這個(gè)類(lèi),從而對(duì)他進(jìn)行拓展
比如我們可以為這個(gè)類(lèi)實(shí)現(xiàn)拓展
const AddName = (name: string) => (cls: { new (...args: any[]): {} }) => { cls.prototype.name = name } @AddName('name') class A { age = 18 } const a = new A() console.log(a.name) console.log(a.age)
方法裝飾器
方法裝飾器的語(yǔ)法如下,你可以獲取到當(dāng)前類(lèi),方法名,以及該屬性的描述符
const log = () => { return (target: any, propertyKey: string, descriptor: PropertyDescriptor) => { console.log(target, propertyKey, descriptor) }; } class A { @log say() {} }
打印如下
A: {}, "say", {
"writable": true,
"enumerable": false,
"configurable": true
}
那么方法裝飾器可以用來(lái)做什么呢?
AOP就是其中一個(gè)例子
AOP(面向切面編程)
在軟件業(yè),AOP為Aspect Oriented Programming的縮寫(xiě),意為:[面向切面編程],通過(guò)[預(yù)編譯]方式和運(yùn)行期間動(dòng)態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)。
AOP是[OOP]的延續(xù),是軟件開(kāi)發(fā)中的一個(gè)熱點(diǎn),也是[Spring]框架中的一個(gè)重要內(nèi)容,是[函數(shù)式編程]的一種衍生范型。利用AOP可以對(duì)業(yè)務(wù)邏輯的各個(gè)部分進(jìn)行隔離,從而使得業(yè)務(wù)邏輯各部分之間的[耦合度]降低,提高程序的可重用性,同時(shí)提高了開(kāi)發(fā)的效率。
這貼一段百科對(duì)AOP的簡(jiǎn)介
下面給一個(gè)簡(jiǎn)單的例子,我們可以對(duì)函數(shù)執(zhí)行過(guò)程進(jìn)行
const log = () => { return (target: any, propertyKey: string, descriptor: PropertyDescriptor) => { const oldFn = descriptor.value descriptor.value = function (...args:any[]) { console.log('在函數(shù)執(zhí)行前'); const res = oldFn.apply(this, args); console.log('在函數(shù)執(zhí)行后', res); return res; } }; } class A { @log() say() { return 'Hello world' } } new A().say()
執(zhí)行結(jié)果如下
[LOG]: "在函數(shù)執(zhí)行前"
* * *
[LOG]: "在函數(shù)執(zhí)行后", "Hello world"
以上就是Typescript裝飾器AOP示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Typescript裝飾器AOP的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
運(yùn)行結(jié)果如下,可以看到下面的數(shù)據(jù)和上方使用mysql客戶端查出來(lái)結(jié)果一致
The solution is: [{"name":"jym","age":"1"},{"name":"jym2","age":"2"},{"name":"jym3","age":"3"},{"name":"jym4","age":"4"}]
通過(guò)mysql2這個(gè)包,我們就可以用node.js連接數(shù)據(jù)庫(kù)了,可以使用一些基礎(chǔ)的API來(lái)直接操作mysql數(shù)據(jù)庫(kù);比如上面的代碼中就執(zhí)行了'SELECT * FROM user'這個(gè)sql語(yǔ)句
除了使用這種基礎(chǔ)庫(kù)之外,我們還可以使用ORM(對(duì)象關(guān)系映射器)框架來(lái)連接數(shù)據(jù)庫(kù),直接用OOP的方式來(lái)編寫(xiě)模型和方法,ORM框架會(huì)幫助你生成對(duì)應(yīng)的sql語(yǔ)句,這樣就可以把關(guān)注點(diǎn)放在業(yè)務(wù)上面,而不用編寫(xiě)SQL語(yǔ)句。這可以讓你的代碼更加簡(jiǎn)潔和可維護(hù)
目前在nodejs中常用的ORM有prisma,sequlize,typeorm等等,下回我們就來(lái)嘗試一下如何用ORM來(lái)連接數(shù)據(jù)庫(kù)
以上就是Node.js連接數(shù)據(jù)庫(kù)實(shí)現(xiàn)過(guò)程詳解的詳細(xì)內(nèi)容,更多關(guān)于Node.js連接數(shù)據(jù)庫(kù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
TypeScript實(shí)現(xiàn)類(lèi)型安全的EventEmitter
這篇文章主要為大家介紹了TypeScript實(shí)現(xiàn)類(lèi)型安全的EventEmitter示例詳解有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03postman數(shù)據(jù)加解密實(shí)現(xiàn)APP登入接口模擬請(qǐng)求
對(duì)于Postman的使用,一般情況下只要發(fā)發(fā)確定的請(qǐng)求與參數(shù)就可以的了,然而,在使用的時(shí)候,尤其是接口測(cè)試時(shí),請(qǐng)求接口的設(shè)計(jì)里面都有數(shù)據(jù)加密,參數(shù)驗(yàn)簽,返回?cái)?shù)據(jù)也有進(jìn)行加密的,這個(gè)時(shí)候就需要使用一些腳本做處理,模擬app登入請(qǐng)求的操作2021-08-08開(kāi)發(fā)typescript項(xiàng)目tsconfig.json配置及選項(xiàng)使用解析
這篇文章主要為大家介紹了tsconfig.json配置及選項(xiàng)使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07TypeScript使用strictnullcheck實(shí)戰(zhàn)解析
這篇文章主要為大家介紹了TypeScript使用strictnullcheck實(shí)戰(zhàn)解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08TypeScript實(shí)現(xiàn)十大排序算法之歸并排序示例詳解
這篇文章主要為大家介紹了TypeScript實(shí)現(xiàn)十大排序算法之歸并排序示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02typescript難學(xué)嗎?前端有必要學(xué)?該怎么學(xué)typescript
TypeScript代碼與?JavaScript?代碼有非常高的兼容性,無(wú)門(mén)檻,你把?JS?代碼改為?TS?就可以運(yùn)行。TypeScript?應(yīng)該不會(huì)脫離?JavaScript?成為獨(dú)立的語(yǔ)言。學(xué)習(xí)?TypeScript?應(yīng)該主要指的是學(xué)習(xí)它的類(lèi)型系統(tǒng)。2022-12-12ThreeJS?入門(mén)如何渲染出第一個(gè)3D圖形
這篇文章主要為大家介紹了ThreeJS?入門(mén)之如何渲染出第一個(gè)3D圖形實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06jsf實(shí)現(xiàn)微信小程序簡(jiǎn)潔登錄頁(yè)面(附源碼)
這篇文章主要介紹了實(shí)現(xiàn)微信小程序簡(jiǎn)潔登錄頁(yè)面?,對(duì)于正在學(xué)習(xí)的小伙伴都有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-01-01TypeScript手寫(xiě)一個(gè)簡(jiǎn)單的eslint插件實(shí)例
這篇文章主要為大家介紹了TypeScript手寫(xiě)一個(gè)簡(jiǎn)單的eslint插件實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02