12_TypeScript 模块 以及 模块化封装DB 库

TypeScript 模块

    • 1、模块中暴露方法1
    • 2、模块中暴露方法2
    • 3、模块中暴露方法3
    • 4、封装[上一节的db 库](https://blog.csdn.net/qq_46143850/article/details/140664100)
    • 5、TypeScript 命名空间

模块的概念(官方)
关于术语的一点说明:请务必注意一点, TypeScript 1.5 里术语名已经发生了变化。“内部模块”现在称为“命名空间”。
“外部模块”现在则简称为“模块”,模块在其自身的作用域里执行,而不是在全局作用域里;
这意味着定义在一个模块里的变量、函数、类等等再模块外部是不可见的,除非你明确地使用 export 形式之一导出它们。相反,如果想使用其它模块导出的变量、函数、类、接口 等的时候,你必须要导入它们,可以使用 import 形式之一。

模块的概念(自己理解):
我们可以把一些公共的功能单独抽离成一个文件作为一个模块。
模块里面的变量、函数、类等默认是私有的,如果我们要在外部访问模块里面的数据(变量、函数、类),
我们需要通过 export 暴露模块里面的数据(变量、函数、类…)
暴露后我们通过 import 引入模块就可以使用模块里面暴露的数据(变量、函数、类…)

1、模块中暴露方法1

let dbUrl = 'xxx'
export function getData(): any[] {console.log("获取数据库中数据")return [{tit: "133"}]
}

在这里插入图片描述

2、模块中暴露方法2

let dbUrl = 'xxx'function getData(): any[] {console.log("获取数据库中数据")return [{tit: "133"}]
}export {getData,dbUrl
}
import {getData } from "./modules/db"// 引入方法1
import {getData as get} from "./modules/db"// 引入方法2console.log(get())

3、模块中暴露方法3

let dbUrl = 'xxx'function getData(): any[] {console.log("获取数据库中数据")return [{tit: "133"}]
}export  default getData
import getData from "./modules/db"console.log(getData())

4、封装上一节的db 库

modules 中 db


interface DBI<T> {add(info:T): boolean;update(info:T, id:number): boolean;delete( id:number):booleanget( id:number):any[]
}// 定义一个操作 mysql 数据库的类
// 注意:要实现泛型接口,这个类也应该是一个泛型类class MysqlDb<T> implements DBI<T> {constructor(){console.log("建立数据库连接")}add(info: T): boolean {console.log((info))return true}update(info: T, id: number): boolean {throw new Error("Method not implemented.");}delete(id: number): boolean {throw new Error("Method not implemented.");}get(id: number): any[] {let list = [{title: "nihao",desc: "描述"}]return list}}
//  MssqlDb 的类class MssqlDb<T> implements DBI<T> {constructor(){console.log("建立数据库连接")}add(info: T): boolean {console.log((info))return true}update(info: T, id: number): boolean {throw new Error("Method not implemented.");}delete(id: number): boolean {throw new Error("Method not implemented.");}get(id: number): any[] {throw new Error("Method not implemented.");}
}
// MongoDb 的类
class MongoDb<T> implements DBI<T> {constructor(){console.log("建立数据库连接")}add(info: T): boolean {console.log((info))return true}update(info: T, id: number): boolean {throw new Error("Method not implemented.");}delete(id: number): boolean {throw new Error("Method not implemented.");}get(id: number): any[] {throw new Error("Method not implemented.");}
}
export {MysqlDb,MssqlDb,MongoDb
}// 引入
import {MysqlDb,MssqlDb, MongoDb} from "./modules/db"// 操作用户表 定义一个 user 类和数据库表做映射
class User {username: string | undefinedpassword: string | undefined
}let u = new User()
u.username = '001'
u.password = '123456'let mysql = new MysqlDb<User>() // 类作为参数来约束数据传入的类型
let mssql = new MssqlDb<User>() // 类作为参数来约束数据传入的类型
let mongodb = new MongoDb<User>() // 类作为参数来约束数据传入的类型
mysql.add(u)
mssql.add(u)
mongodb.add(u)

进一步封装:将 User 类再次封装,定义数据库的映射

// user.ts
import { MysqlDb } from "./db"
class User {username: string | undefinedpassword: string | undefined
}let UserModel = new MysqlDb<User>()
export {UserModel,User
}//index 中引入使用
import {User, UserModel} from "./modules/user"
let u = new User()
u.username = '001'
u.password = '123456'
UserModel.add(u)
UserModel.get(123)

5、TypeScript 命名空间

命名空间:
在代码量比较大的情况下,为了避免各种变量命名冲突,可将相似功能的函数、类、接口等放置到命名空间 内
同 java 的包,.net 的命名空间一样,TypeScript 的命名空间可以将代码包裹起来,只对外暴露需要在外部访问的对象,命名空间内的对象通过 export 关键字进行暴露,外部使用 import 引入使用

命名空间和模块的区别:
命名空间:内部模块,主要用于组织代码,避免命名冲突。
模块:ts 的外部模块的简称,侧重代码的复用,一个模块里可能会有多个命名空间。

不同命名空间中的变量、类、接口等可以同名。
每个模块中可以有多个 命名空间,给外部使用的时候也是使用 export 进行暴露 namespace

// 命名空间默认是私有的,要在外部使用里面的函数、类、接口、都需要使用 export 进行暴露
namespace A {interface Animal {name: string;eat(str: string):void;}interface Person extends Animal {work():void}export class Programmer {name: string;constructor(name:string) {this.name = name}coding() {console.log(this.name, 'coding')}}export class Web extends Programmer implements Person {constructor(name: string) {super(name)}eat() {console.log(this.name + "吃大米")}work() {console.log(this.name + "正在工作")}}
}
let w = new A.Web("丽丝") // 实例化命名空间 A 中的 Web 类
w.work()
w.coding()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/49995.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言 -- 动态内存管理

C语言 -- 动态内存管理 1. 为什么要有动态内存分配2. malloc 和 free2.1 malloc2.2 free 3. calloc 和 realloc3.1 calloc3.2 realloc 4. 常见的动态内存的错误4.1 对NULL指针的解引用操作4.2 对动态开辟空间的越界访问4.3 对非动态开辟内存使用free释放4.4 使用free释放一块动…

05 capture软件创建元器件库(以STM32为例)

05 创建元器件库_以STM32为例 一、新建原理图库文件二、新建器件三、开始创建元器件 一些IC类元件&#xff0c;需要自己创建元器件库。 先看视频&#xff0c;然后自己创建STM32F103C8T6的LQFP48的元器件。 STM32F103C8T6是目前为止&#xff0c;自己用的最多的芯片。 先要有数据…

Qt自定义MessageToast

效果&#xff1a; 文字长度自适应&#xff0c;自动居中到parent&#xff0c;会透明渐变消失。 CustomToast::MessageToast(QS("最多添加50张图片"),this);1. CustomToast.h #pragma once#include <QFrame>class CustomToast : public QFrame {Q_OBJECT pub…

【学习笔记】解决Serial Communication Library编译问题

【学习笔记】解决编译 Serial Communication Library 时的 Catkin 依赖问题 Serial Communication Library 是一个用 C 编写的用于连接类似 rs-232 串口的跨平台库。它提供了一个现代的 C 接口&#xff0c;它的工作流程设计在外观和感觉上与 PySerial 相似&#xff0c;但串口速…

ControlNet on Stable Diffusion

ControlNet on Stable Diffusion 笔记来源&#xff1a; 1.Adding Conditional Control to Text-to-Image Diffusion Models 2.How to Use OpenPose & ControlNet in Stable Diffusion 3.ControlNet与DreamBooth&#xff1a;生成模型的精细控制与主体保持 4.Introduction t…

光猫设置桥接 路由器pppoe拨号 设置正常访问光猫 (openwrt)

网络信息展示 光猫桥接很简单吧&#xff0c;就不说了。先来列出修改前的网络接口和网络信息。 光猫192.168.1.1&#xff0c;openwrt 10.0.0.0/8 初始配置 需要记录的信息&#xff1a;WAN的网络设备&#xff08;eth1&#xff09;&#xff0c;光猫的IP&#xff08;192.168.1.1&am…

使用法国云手机进行面向法国的社媒营销

在当今数字化和全球化的时代&#xff0c;社交媒体已经成为企业营销和拓展市场的重要工具。对于想进入法国市场的企业来说&#xff0c;如何在海外社媒营销中脱颖而出、抓住更多的市场份额&#xff0c;成为了一个关键问题。法国云手机正为企业提供全新的营销工具&#xff0c;助力…

《人工智能大语言模型技术发展研究报告(2024)》【下载】

《人工智能大语言模型技术发展研究报告&#xff08;2024&#xff09;》下载 自2023年起&#xff0c;大模型技术产品的快速迭代和升级&#xff0c;已经成为全球科技竞争的关键因素。由中国软件评测中心发布的《人工智能大语言模型技术发展研究报告&#xff08;2024&#xff09;》…

kafka详解及应用场景介绍

Kafka架构 Kafka架构&#xff0c;由多个组件组成&#xff0c;如下图所示&#xff1a; 主要会包含&#xff1a;Topic、生产者、消费者、消费组等组件。 服务代理&#xff08;Broker&#xff09; Broker是Kafka集群中的一个节点&#xff0c;每个节点都是一个独立的Kafka服务器…

反激Flyback从逆向到初步设计(UC2844)

一.Flyback基本拓扑 国标gb/t 12325-2008《电能质量供电电压偏差》规定&#xff1a;220v单向供电电压偏差为标称电压的-10%&#xff0c;7%。 对应220V的标称电压&#xff0c;其浮动范围是在198~235.4V。以下运算均基于此规定进行。 首先220V进入EMI模块&#xff0c;消除差模干扰…

【Docker】Windows11环境下的安装

前置依赖环境配置 确保虚拟化开启 搜索栏直接搜索如下功能 勾选下面两个选项&#xff0c;确定 重启电脑&#xff0c;以管理员身份打开PowerShell wsl --status wsl --update打开微软应用商店选择一个Ubuntu版本下载并打开 输入一个用户名和密码 然后就可以在Windows下使…

FlowUs与生成式AI结合的未来展望:智能助手问问AI chat与自主代理Agent的应用

生成式AI在对话系统&#xff08;Chat&#xff09;和自主代理&#xff08;Agent&#xff09;中的应用将会带来显著的技术进步和商业机会。 对话系统&#xff08;Chat&#xff09; 对话系统是一种人工智能软件&#xff0c;它能够模拟人类对话&#xff0c;通过自然语言处理&…

go-kratos 学习笔记(7) 服务发现服务间通信grpc调用

服务发现 Registry 接口分为两个&#xff0c;Registrar 为实例注册和反注册&#xff0c;Discovery 为服务实例列表获取 创建一个 Discoverer 服务间的通信使用的grpc&#xff0c;放到data层&#xff0c;实现的是从uses服务调用orders服务 app/users/internal/data.go 加入 New…

2024安全大模型技术与市场研究报告

大模型驱动的AIGC引发技术革命&#xff0c;国资委强调国企需加大AI投入。大模型解决网络安全行业攻防不对等问题&#xff0c;国内外企业纷纷推出基于大模型的网络安全产品&#xff0c;AI将改变网络安全产品格局。 自 2022 年底开始&#xff0c;以 LLM(大语言模型&#xff0c;简…

k8s核心知识总结

写在前面 时间一下子到了7月份尾&#xff1b;整个7月份都乱糟糟的&#xff0c;不管怎么样&#xff0c;日子还是得过啊&#xff0c; 1、7月份核心了解个关于k8s&#xff0c;iceberg等相关技术&#xff0c;了解了相关的基础逻辑&#xff0c;虽然和数开主线有点偏&#xff0c;但是…

系统架构设计师②:操作系统

系统架构设计师②&#xff1a;操作系统 操作系统作用 ①管理系统的硬件、软件、数据资源 ②控制程序运行 ③人机之间的接口 ④应用软件与硬件之间的接口 进程管理 进程是程序在一个数据集合上运行的过程&#xff0c;它是系统进行资源分配和调度的一个独立单位。它由程序块、…

qt表格模型视图

Qt 提供了一套强大的模型/视图框架&#xff0c;允许你以一种非常灵活和高效的方式显示和处理数据。在 Qt 中&#xff0c;表格视图&#xff08;TableView&#xff09;和模型&#xff08;TableModel&#xff09;是这种框架的一部分&#xff0c;常用于显示和编辑表格数据。 以下是…

【初阶数据结构】8.二叉树(3)

文章目录 4.实现链式结构二叉树4.1 前中后序遍历4.1.1 遍历规则4.1.2 代码实现 4.2 结点个数以及高度等4.3 层序遍历4.4 判断是否为完全二叉树4.5层序遍历和判断是否为完全二叉树完整代码 4.实现链式结构二叉树 用链表来表示一棵二叉树&#xff0c;即用链来指示元素的逻辑关系…

space desk设备屏幕拓展软件

在正常开发的时候一般采用多个屏幕的方式来提高效率&#xff0c;这时就采用hdmi和vga拓展的形式&#xff0c;前提是屏幕但往往有电源以及续航不够的问题&#xff0c;不太方便出门在外的话 这时我就推荐大家使用软件无线连接的形式 进行软件下载下图为投影端可以在pc端下载 我…

如何保护您的 WordPress 不被黑?

明月可以说是见到过太多 WordPress 网站被黑的示例了&#xff0c;加上平时明月也会接一些 WordPress 疑难杂症的解决服务订单&#xff0c;所以这方面绝对是专业对口了。作为一个资深 WordPress 博客站长&#xff0c;谁都有被黑过的经历&#xff0c;都是一步步走过来的&#xff…