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"// 引入方法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.mfbz.cn/a/870326.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MFC:以消息为基础的事件驱动系统和消息映射机制

以消息为基础的事件驱动系统和消息映射机制 (1)消息 A.What&#xff08;什么是消息&#xff09; 本质是一个数据结构&#xff0c;用于应用程序不同部分之间进行通信和交互 typedef struct tagMSG {HWND hwnd; // 接收该消息的窗口句柄UINT message; // 消息标…

耳机、音响UWB传输数据模组,飞睿智能低延迟、高速率超宽带uwb模块技术音频应用

在数字化浪潮席卷全球的今天&#xff0c;无线通信技术日新月异&#xff0c;其中超宽带&#xff08;Ultra-Wideband&#xff0c;简称UWB&#xff09;技术以其独特的优势&#xff0c;正逐步成为无线传输领域的新星。本文将深入探讨飞睿智能UWB传输数据模组在音频应用中的创新应用…

一份进销存系统指南,帮你选择合适的进销存系统

在数字化转型的浪潮中&#xff0c;众多企业正积极探索适合自身的转型路径。面对琳琅满目的进销存系统市场&#xff0c;选择一款既合适又靠谱的解决方案成为了企业的迫切需求。本文将通过深入分析与比较&#xff0c;为企业选择合适的进销存系统提供指南&#xff0c;助企业精准选…

港科夜闻 | 香港科大与阿里巴巴合作,计划成立大数据与人工智能联合实验室

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科大与阿里巴巴合作&#xff0c;计划成立大数据与人工智能联合实验室。香港科大7月19日与阿里巴巴集团签署合作备忘录&#xff0c;计划成立「香港科技大学–阿里巴巴大数据与人工智能联合实验室」&#xff0c;就生成…

了解Babel原理和手写一个babel插件

babel 简介 Babel 是一个 JavaScript 编译器&#xff0c;它能将 es2015&#xff0c;react 等低端浏览器无法识别的语言&#xff0c;进行编译。上图的左边代码中有箭头函数&#xff0c;Babel 将进行了源码转换&#xff0c;下面我们来看 Babel 的运行原理。 Babel 运行原理 Ba…

【视频讲解】ResNet深度学习神经网络原理及其在图像分类中的应用|附Python代码

全文链接&#xff1a;https://tecdat.cn/?p37134 原文出处&#xff1a;拓端数据部落公众号 分析师&#xff1a;Canglin Li 本文深入探讨了卷积层&#xff08;Convolutional Layer&#xff09;在深度学习框架中的核心作用与操作机制&#xff0c;并分析了其在特征提取、网络构…

DLMS/COSEM中公开密钥算法的使用_椭圆曲线加密法

1.概述 椭圆曲线密码涉及有限域上的椭圆曲线上的算术运算。椭圆曲线可以定义在任何数字域上(实数、整数、复数)&#xff0c;但在密码学中&#xff0c;椭圆曲线最常用于有限素数域。 素数域上的椭圆曲线由一组实数(x, y)组成&#xff0c;满足以下等式: 方程的所有解的集合构成…

ForCloud赢战攻防 无惧突发0day漏洞 ForCloud虚实结合快速处置

攻防演练前夕&#xff0c;亚信安全威胁情报中心监测到一个存在于Nacos Derby中的0day漏洞&#xff0c;漏洞利用代码为公开状态&#xff0c;攻击者利用此漏洞可在目标服务器上执行任意代码。 造成的破坏程度&#xff1f;你可能正在使用&#xff01; Nacos&#xff08;Dynamic …

【MySQL】记录MySQL加载数据(LOAD DATA)

MySQL LOAD DATA 一、背景二、模拟生成用户信息三、加载到mysql表3.1、建表语句3.2 加载数据3.3、查看结果 一、背景 现在有个需求是将用户信息存入student.data文件中&#xff0c;在现在load到数据库中 二、模拟生成用户信息 假设用户信息&#xff0c;包含姓名&#xff0c;…

ITK-中值滤波

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 中值滤波原理 中值滤波是一种常用的非线性滤波技术&#xff0c;用于去除图像中的噪声&#xff0c;特别是椒盐噪声和脉冲噪声。它…

15现代循环神经网络—GRU与LSTM

目录 1.门控循环单元 GRU关注一个序列门候选隐状态(candidate hidden state)隐状态总结从零开始代码实现代码简洁实现2.长短期记忆网络 LSTM门候选记忆单元(candidate memory cell)记忆单元隐状态代码1.门控循环单元 GRU GRU 是最近几年提出来的,在 LSTM 之后,是一个稍微简…

科普文:后端性能优化的实战小结

一、背景与效果 ICBU的核心沟通场景有了10年的“积累”&#xff0c;核心场景的界面响应耗时被拉的越来越长&#xff0c;也让性能优化工作提上了日程&#xff0c;先说结论&#xff0c;经过这一波前后端齐心协力的优化努力&#xff0c;两个核心界面90分位的数据&#xff0c;FCP平…

删除的视频怎样才能恢复?详尽指南

在日常生活中&#xff0c;我们有时会不小心删除一些重要的视频文件&#xff0c;或者在整理存储空间时不慎丢失了珍贵的记忆片段。这时候&#xff0c;我们可以通过一些数据恢复工具和技巧&#xff0c;找回这些被删除的视频。本文将详细介绍几种常见且有效的视频恢复方法&#xf…

C#,.NET常见算法

1.递归算法 1.1.C#递归算法计算阶乘的方法 using System;namespace C_Sharp_Example {public class Program{/// <summary>/// 阶乘&#xff1a;一个正整数的阶乘Factorial是所有小于以及等于该数的正整数的积&#xff0c;0的阶乘是1&#xff0c;n的阶乘是n&#xff0…

《操作系统》(学习笔记)(王道)

一、计算机系统概述 1.1 操作系统的基本概念 1.1.1 操作系统的概念 1.1.2 操作系统的特征 1.1.3 操作系统的目标和功能 1.2 操作系统的发展与分类 1.2.1 手工操作阶段&#xff08;此阶段无操作系统&#xff09; 1.2.2 批处理阶段&#xff08;操作系统开始出现&#xff0…

前端知识--前端访问后端技术Ajax及框架Axios

一、异步数据请求技术----Ajax Ajax是前端访问后端的技术&#xff0c;为异步请求&#xff08;不刷新页面&#xff0c;请求数据&#xff0c;只更新局部数据&#xff09;。 例如&#xff1a;在京东网站中搜索电脑&#xff0c;就会出现一些联想搜索&#xff0c;但此时页面并没有…

WEB开发-HTTP认证

1 需求 2 接口 3 示例 HTTP Authentication&#xff08;HTTP认证&#xff09;是Web服务器用来验证客户端请求的一种机制。它通常用于保护需要用户凭据&#xff08;如用户名和密码&#xff09;才能访问的资源。HTTP认证有几种不同的分类或方法&#xff0c;以下是其中一些主要的分…

手机怎么设置不同的ip地址

在数字化日益深入的今天&#xff0c;智能手机已成为我们生活、工作和学习中不可或缺的设备。然而&#xff0c;随着网络应用的广泛和深入&#xff0c;我们有时需要为手机设置不同的IP地址来满足特定需求。比如&#xff0c;避免网络限制、提高网络安全、或者进行网络测试等。本文…

解决R语言找不到系统库导致的报错

1、基本需知 1.1、系统库 系统库&#xff08;System library&#xff09;是一组预先编写和编译好的软件模块集合&#xff0c;用于支持操作系统的基本功能和提供一些常见的服务。这些库通常由操作系统或第三方开发者提供&#xff0c;并且在系统安装过程中被预装或者用户可以额…

分享 2 个 .NET EF 6 只更新某些字段的方法

前言 EF 更新数据时&#xff0c;通常情况下&#xff0c;是更新全部字段的&#xff0c;但实际业务中&#xff0c;更新全部字段的情况其实很少&#xff0c;一般都是修改其中某些字段&#xff0c;所以为了实现这个目标&#xff0c;很多程序员通常会这样作&#xff1a; 先从数据库…