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

news2024/11/25 2:33:30

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"// 引入方法2

console.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):boolean
  get( 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 | undefined
  password: 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 | undefined
  password: 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.coloradmin.cn/o/1951053.html

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

相关文章

Linux网络-wget命令

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注我&#xff0c;我尽量把自己会的都分享给大家&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 Linux服务器作为一个常用的网络服务器&#xff0c;主要的作用就是向客户端提供网络…

【工具推荐】强大的JS渗透测试工具:URLFinder

一、下载地址 https://github.com/pingc0y/URLFinder 二、工具原理 从表现中JS中提取URL或者敏感数据&#xff0c;一款用于快速提取检测页面中JS与URL的工具。功能类似于JSFinder&#xff0c;但JSFinder好久没更新了。 三、工具介绍 1、下载解压出来包含下面两个文件 2、直…

内网渗透—内网穿透工具NgrokFRPNPSSPP

前言 主要介绍一下常见的隧道搭建工具&#xff0c;以此来达到一个内网穿透的目的。简单说一下实验滴环境吧&#xff0c;kali作为攻击机&#xff0c;winserver2016作为目标靶机。 kali 192.168.145.171 winserver2016 10.236.44.127 显然它们处于两个不同的局域网&#xff0c…

SQLException:Operation not allowed after ResultSet closed

运行代码时出现的错误&#xff1a; 这是在运行简单的JDBC访问数据库时出现的问题&#xff0c;原因是在ResultSet方法中添加了close()关闭方法,如图&#xff1a; ResultSet 是通过 query 方法获得的&#xff0c;并且在 try-catch 块中没有显式地关闭它。这实际上是 一个常见的…

ServletContainerInitializer接口详解

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhlServletContainerInitializer概述 ServletContainerInitializer是Servlet 3.0规范中引入的一个接口,它的主要目的是允许开发者在Servlet容器(如Tomcat、Jetty等)启动时执行一些自定义的初始化代…

池化层pytorch最大池化练习

神经网络构建 class Tudui(nn.Module):def __init__(self):super(Tudui, self).__init__()self.maxpool1 MaxPool2d(kernel_size3, ceil_modeFalse)def forward(self, input):output self.maxpool1(input)return output Tensorboard 处理 writer SummaryWriter("./l…

Linux系统上安装Redis

百度网盘&#xff1a; 通过网盘分享的文件&#xff1a;redis_linux 链接: https://pan.baidu.com/s/1ZcECygWA15pQWCuiVdjCtg?pwd8888 提取码: 8888 1.把安装包拖拽到/ruanjian/redis/文件夹中&#xff08;自己选择&#xff09; 2.进入压缩包所在文件夹&#xff0c;解压压缩…

生信技能54 - WisecondorX多线程并行分析CNV

WisecondorX分析CNV,默认单样本分析,batch_analysis参数设置为True可启动多样本并行分析。 WisecondorX基本使用方法以及npz文件转换和reference构建参考文章: 生信技能53 - wiseconrdoX自动化批量npz转换和reference构建 github: https://github.com/CenterForMedicalGe…

微服务:解决复杂业务的妙方

1 微服务介绍 1)什么是微服务 ​ 微服务&#xff08;Microservices&#xff09;是一种软件架构风格&#xff0c;它将一个大型应用程序拆分成许多较小的、松散耦合的、独立运行的服务。这些服务通常围绕特定功能或业务领域组织&#xff0c;可以独立开发、部署、扩展和更新。微…

【网络安全学习】 SQL注入01:基础知识

&#x1f4bb; 1. 什么是SQL注入 SQL注入是一种针对Web程序中数据库层的安全漏洞的攻击方式。它利用了程序对用户输入数据合法性的判断或过滤不严&#xff0c;允许攻击者在设计不良的程序中添加额外的SQL语句&#xff0c;从而执行计划外的命令或访问未授权的数据。攻击者可以通…

[Unity] ShaderGraph实现不同贴图素材的同一材质球复用

无意间发现的ShaderGraph小技巧&#xff0c; 可以实现同一个ShaderGraph&#xff0c;同一个Material材质球&#xff0c; 但使用不同的Texture贴图&#xff0c;而Sprite显示不会相互覆盖。 具体实现方法如下&#xff1a; 声明Texture2D时&#xff0c;把名字命名成&#xff1a…

超燃!纯AI生成《泰坦尼克号》大片!浙大阿里发布MovieDreamer:超长电影生成“梦工厂“

论文链接&#xff1a;https://arxiv.org/pdf/2407.16655 项目主页&#xff1a;https://aim-uofa.github.io/MovieDreamer/ github链接&#xff1a;https://github.com/aim-uofa/MovieDreamer 亮点直击 MovieDreamer&#xff0c;一个新颖的分层框架&#xff0c;将自回归模型与扩…

人工智能算法工程师(中级)课程19-模型的量化与部署之模型部署和存储方式与代码详解

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能算法工程师(中级)课程19-模型的量化与部署之模型部署和存储方式与代码详解本文全面介绍了神经网络模型在实际应用中的部署与存储策略&#xff0c;重点覆盖了两大主流框架&#xff1a;LibTorch和TensorRT。L…

JavaScript模拟滑动手势

双击回到顶部 左滑动 右滑动 代码展示 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Gesture…

linux命令更新-文本处理awk

awk命令简介 awk是一种强大的文本处理工具&#xff0c;可以对文本文件进行格式化、统计、计算等操作。它逐行读取文本文件&#xff0c;并对每一行进行处理。awk的语法相对简单&#xff0c;但功能非常强大&#xff0c;是Linux系统中常用的文本处理工具之一。 awk命令基本语法 …

某数据泄露防护(DLP)系统NoticeAjax接口SQL注入漏洞复现 [附POC]

文章目录 某数据泄露防护(DLP)系统NoticeAjax接口SQL注入漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现某数据泄露防护(DLP)系统NoticeAjax接口SQL注入漏洞复现 [附POC] 0x01 前言 免责声明:请勿利用文章内…

60个常见的 Linux 指令

1.ssh 登录到计算机主机 ssh -p port usernamehostnameusername&#xff1a; 远程计算机上的用户账户名。 hostname&#xff1a; 远程计算机的 IP 地址或主机名。 -p 选项指定端口号。 2.ls 列出目录内容 ls ls -l # 显示详细列表 ls -a # 显示包括隐藏文件在内的所有内…

关于深度学习中的cuda编程,cuda相关介绍

深度学习中会涉及大量的、重复的矩阵运算、图形运算&#xff0c;而CPU对这种简单的加减法加速不够显著&#xff0c;可以使用GPU进行加速运算 CUDA是英伟达旗下的专门为深度学习加速运算的显卡&#xff0c;其对于简单的浮点运算、矩形运算相较于CPU加速了数倍不止 本文介绍CUD…

结合GB/T28181规范探讨Android平台设备接入模块心跳实现

技术背景 好多开发者在用我们Android平台GB28181设备接入模块的时候&#xff0c;更希望跟我们探讨一些协议规范方面&#xff0c;以便在现场对接时&#xff0c;可以知其然知其所以然。比如&#xff0c;有开发者提到&#xff0c;GB28181的状态消息报送这块到底要怎么实现&#x…

搭建Vue开发环境

一、下载Vue.js 进入官网教程安装 — Vue.js (vuejs.org) 下载开发版本到本地 二、安装 Vue Devtools 安装完成后