使用ts的最佳境界:化型別於無形
在專案中使用ts可以帶來型別智慧提示與校驗的諸多好處。同時,為了減少型別標註,達到化型別於無形
的效果,CabloyJS引入了ioc和依賴查詢的機制。在上一篇文章中,我們建立了一個業務模組test-home,並且採用依賴查詢的機制演示瞭如何優雅的定義和使用資源,包括:Service服務、Config配置、國際化語言資源、Error錯誤異常
在實際的專案當中,經常會遇到跨模組訪問資源的場景,那麼,CabloyJS的依賴查詢機制是否仍然可以優雅的實現跨模組訪問呢?讓我們一睹為快
模組化體系與任務說明
CabloyJS全棧框架的前後端均採用模組化體系。一個CabloyJS專案由多個業務模組組成,每個業務模組都可以包含與自身業務相關的資源,比如:Service服務、Config配置、國際化語言資源、Error錯誤異常、中介軟體、定時任務、訊息佇列、系統啟動項,等等
在這裡,我們建立一個新的業務模組test-work,在test-work中訪問test-home提供的資源
1. 新建業務模組
cabloy api:create:module test-work
2. 新建API
透過一個命令同時建立一組檔案:Route、Controller、Service
cabloy api:create:controller work
3. 跨模組訪問Service服務
接下來,我們在剛才新建的Service當中,訪問模組test-home的Service服務
import { BeanBase, Local } from '@cabloy/core';
import { ScopeModule } from '../resource/this.js';
@Local()
export class LocalWork extends BeanBase<ScopeModule> {
async action({ user }) {
+ const scopeHome = this.getScope('test-home');
+ return scopeHome.local.home.action({ user });
// return user;
}
}
- 透過getScope方法獲取模組test-home的scope物件
- 透過scope物件直接訪問Service服務:
home
看一下動畫演示,提供了完整的型別智慧提示:
4. 跨模組訪問Config配置
訪問模組test-home的Config配置
import { BeanBase, Local } from '@cabloy/core';
import { ScopeModule } from '../resource/this.js';
@Local()
export class LocalWork extends BeanBase<ScopeModule> {
async action({ user }) {
const scopeHome = this.getScope('test-home');
+ const prompt = scopeHome.config.prompt;
return scopeHome.local.home.action({ user });
// return user;
}
}
- 直接透過scopeHome取得config中的prompt屬性值
看一下動畫演示,提供了完整的型別智慧提示:
5. 跨模組訪問國際化語言資源
訪問模組test-home的國際化語言資源
import { BeanBase, Local } from '@cabloy/core';
import { ScopeModule } from '../resource/this.js';
@Local()
export class LocalWork extends BeanBase<ScopeModule> {
async action({ user }) {
const scopeHome = this.getScope('test-home');
+ const message = scopeHome.locale.HelloWorld();
+ const message1 = scopeHome.locale.HelloWorld.locale('en-us');
+ const message2 = scopeHome.locale.HelloWorld.locale('zh-cn');
return scopeHome.local.home.action({ user });
// return user;
}
}
看一下動畫演示,提供了完整的型別智慧提示:
6. 跨模組訪問Error錯誤異常
丟擲模組test-home提供的Error錯誤異常
import { BeanBase, Local } from '@cabloy/core';
import { ScopeModule } from '../resource/this.js';
@Local()
export class LocalWork extends BeanBase<ScopeModule> {
async action({ user }) {
const scopeHome = this.getScope('test-home');
+ scopeHome.error.Error001.throw();
return scopeHome.local.home.action({ user });
// return user;
}
}
- 直接透過scopeHome丟擲錯誤異常Error001
看一下動畫演示,提供了完整的型別智慧提示:
後記
CabloyJS採用ioc和依賴查詢的機制,讓ts的使用達到了化型別於無形
的最佳境界,從而讓我們的程式碼保持優雅和簡潔,進而也能顯著提升開發效率,保證程式碼質量
欲瞭解更多,請關注每晚8點B站直播:濮水程式碼