使用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;
}
}
  1. 通过getScope方法获取模块test-home的scope对象
  2. 通过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;
}
}
  1. 直接通过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;
}
}
  1. 直接通过scopeHome抛出错误异常Error001

看一下动画演示,提供了完整的类型智能提示:

后记

CabloyJS采用ioc和依赖查找的机制,让ts的使用达到了化类型于无形的最佳境界,从而让我们的代码保持优雅和简洁,进而也能显著提升开发效率,保证代码质量

欲了解更多,请关注每晚8点B站直播:濮水代码

比nestjs更优雅的ioc:跨模块访问资源的更多相关文章

  1. WPF整理-跨程序集访问资源

    “Sometimes binary resources are defined in one assembly (typically a class library), but areneeded i ...

  2. Javascript 跨域访问解决方案 总结

    在客户端编程语言中,如javascript和ActionScript,同源策略是一个很重要的安全理念,它在保证数据的安全性方面有着重要的意义.同 源策略规定跨域之间的脚本是隔离的,一个域的脚本不能访问 ...

  3. GoodReader跨域访问HT for Web手册

    最近下载了GoodReader App,发现GoodReader中打开的页面不仅支持WebGL,同时还允许跨域访问资源,以前不少HT for Web手册的例子需要Web服务器发布的方式才能访问,否则需 ...

  4. cors解决Web跨域访问问题

    首先了解一下什么是跨域以及解决的几种常见方式. 跨域,指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器施加的安全限制. 所谓同源是指,域名,协议,端口均相同. 举例: 相对于 ...

  5. Spring Boot 2中对于CORS跨域访问的快速支持

    原文:https://www.jianshu.com/p/840b4f83c3b5 目前的程序开发,大部分都采用前后台分离.这样一来,就都会碰到跨域资源共享CORS的问题.Spring Boot 2 ...

  6. 用Assert(断言)封装异常,让代码更优雅(附项目源码)

    有关Assert断言大家并不陌生,我们在做单元测试的时候,看业务事务复合预期,我们可以通过断言来校验,断言常用的方法如下: public class Assert { /** * 结果 = 预期 则正 ...

  7. STL 跨模块 调用 异常 解决

    本文为转载别人的,以作收藏之用 百度了一天,现在把结论放上边: 1.不要用STL(std::string属于STL)来跨模块传输数据,例如:dll(so)之间,dll(so)和exe(elf)之间. ...

  8. 一种比css_scoped和css_module更优雅的避免css命名冲突小妙招

    css_scoped 与 css_module 我们知道,简单的class名称容易造成css命名重复,比如你定义一个class: <style> .main { float: left; ...

  9. Karmada v1.3:更优雅 更精准 更高效

    摘要:最新发布的1.3版本中,Karmada重新设计了应用跨集群故障迁移功能,实现了基于污点的故障驱逐机制,并提供平滑的故障迁移过程,可以有效保障服务迁移过程的连续性(不断服). 本文分享自华为云社区 ...

  10. PostCSS一种更优雅、更简单的书写CSS方式

    Sass团队创建了Compass大大提升CSSer的工作效率,你无需考虑各种浏览器前缀兼,只需要按官方文档的书写方式去写,会得到加上浏览器前缀的代码,如下: .row { @include displ ...

随机推荐

  1. Python-Json异常:Object of type Decimal is not JSON serializable

    源起: 使用python分离出一串文本,因为是看起来像整数,结果json转换时发生异常:TypeError: Object of type Decimal is not JSON serializab ...

  2. 2、hystrix原理

    hystrix熔断机制 1.隔离机制 线程隔离: Hystrix在用户请求和服务之间加入了线程池. Hystrix为每个依赖调用分配一个小的线程池,如果线程池已满调用将被立即拒绝,默认不采用排队.加速 ...

  3. css 布局整理2022-4

    理解CSS3里的Flex布局用法(转自网上,博客园修改一些方便更易看懂) 简单有法: 几个横排元素在竖直方向上居中 display: flex; flex-direction: row;//横向排列 ...

  4. 简单实用算法—分布式自增ID算法snowflake(雪花算法)

    目录 算法概述 ID结构 算法特性 算法代码(C#) 算法测试 算法概述 分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先 ...

  5. Python爬虫实战系列2:虎嗅网24小时热门新闻采集

    一.分析页面 打开虎嗅网,点击[24小时] 本次采集,我们以这24小时的热门新闻为案例. 1.1.分析请求 F12打开开发者模式,然后点击Network后点击任意一个请求,Ctrl+F开启搜索,输入标 ...

  6. Nodejs 命令行调用 exec 与 spawn 差异--- 解决 spawn yarn ENOENT error

    Nodejs 命令行调用 exec 与 spawn 差异 比如在前端工程项目中 Nodejs 要调用命令行命令如: yarn electron:build exec 调用 yarn 命令,为了能使命令 ...

  7. 使用 NVIDIA CloudXR 从 Google Cloud 流式传输 VR 和 AR 内容

    过去,与 VR 交互需要专用的高端工作站,以及(取决于头显).壁挂式传感器和专用物理空间.VR 中的复杂任务可能会突破传感器范围.电缆长度和空间边界的限制,使艺术家陷入困境并限制他们的行动.该解决方案 ...

  8. 记录--用JS轻松实现一个录音、录像、录屏的工具库

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 最近项目遇到一个要在网页上录音的需求,在一波搜索后,发现了 react-media-recorder 这个库.今天就跟大家一起研究一 ...

  9. KingbaseES json操作符

    下表列出了常用的json数据类型操作符: 操作符 操作符右侧数据类型 返回类型 描述 -> int json or jsonb 获得 JSON 数组元素(索引从 0 开始,负整数从末尾开始计) ...

  10. virtualbox安装windows10出现OOBE,卡在OOBE。

    参照 https://zhuanlan.zhihu.com/p/419237209 https://www.0z.gs/win/781.html 文档 https://learn.microsoft. ...