ts面试题总结

news2024/11/25 1:02:58

文章目录

  • 前言
  • ts和js的区别?
  • 什么是Typescript的方法重载?
  • Typescript中never 和 void 的区别?
  • typescript 中的 is 关键字有什么用?
  • TypeScript支持的访问修饰符有哪些?
  • 如何定义一个数组,它的元素可能是字符串类型,也可能是数值类型?
  • Typescript中泛型是什么?
  • TypeScript 的内置数据类型有哪些?
  • ts中any和unknown有什么区别?
  • 如何将 unknown 类型指定为一个更具体的类型?
  • 说说对 TypeScript 中命名空间与模块的理解?区别?
  • ts中的枚举类型
  • typeScript中的方法重写是什么?
  • 什么是TypeScript映射文件?
  • Typescript中 interface 和 type 的差别是什么?
  • 说一说TypeScript中的类及其特性。
  • Typescript中什么是装饰器,它们可以应用于什么?
  • TypeScript mixin。
  • 后言

前言

hello world欢迎来到前端的新世界


😜当前文章系列专栏:Typescript
🐱‍👓博主在前端领域还有很多知识和技术需要掌握,正在不断努力填补技术短板。(如果出现错误,感谢大家指出)🌹
💖感谢大家支持!您的观看就是作者创作的动力

ts和js的区别?

ts和js的区别?


什么是Typescript的方法重载?

在TypeScript中,方法重载(Method Overloading)是一种允许函数在不同参数数量或参数类型下具有不同的返回类型或行为的特性。这允许您以一种更灵活的方式定义函数,并根据传入的参数类型或数量来选择适当的行为或返回类型。

方法重载通常用于提供更加严格的类型检查和更好的类型推断,以及在代码中提供更清晰的接口。它使得函数可以根据不同的参数签名,提供不同的实现方式,而无需使用额外的运行时检查。

要定义方法重载,您需要按照以下步骤进行:

  • 首先,定义一个函数的多个签名(overload signatures)。每个签名包含一个参数列表和一个返回类型。
  • 然后,定义一个实际的函数体,这个函数体实现了多个签名所涵盖的不同情况。
    这里有一个简单的例子,演示了如何在TypeScript中使用方法重载:
function greet(name: string): string;
function greet(age: number): string;
function greet(value: string | number): string {
  if (typeof value === "string") {
    return `Hello, ${value}!`;
  } else {
    return `You are ${value} years old!`;
  }
}

console.log(greet("Lydia")); // Output: "Hello, Lydia!"
console.log(greet(30)); // Output: "You are 30 years old!"

上面定义了greet函数的两个不同的签名:一个接受string类型参数,另一个接受number类型参数。然后,我们实现了一个函数体,根据传入的参数类型进行相应的处理。

使用方法重载,TypeScript能够更好地检查函数调用,以确保传递的参数类型与预期的类型相符,并提供适当的类型推断,从而增加代码的类型安全性和可读性。

Typescript中never 和 void 的区别?

  • void 表示没有任何类型(可以被赋值为 null 和 undefined)。
  • never 表示一个不包含值的类型,即表示永远不存在的值。
  • 拥有 void 返回值类型的函数能正常运行。拥有 never 返回值类型的函数无法正常返回,无法终止,或会抛出异常。

typescript 中的 is 关键字有什么用?

TypeScript 中的 is 关键字用于类型保护,可以在运行时判断一个对象是否属于某个类型,并根据不同的类型执行不同的逻辑。

具体来说,is 关键字通常和 instanceof 运算符一起使用,用于判断一个对象是否是某个类的实例。例如:

class Animal {
    name: string;
    constructor(name: string) {
        this.name = name;
    }
}

class Dog extends Animal {
    breed: string;
    constructor(name: string, breed: string) {
        super(name);
        this.breed = breed;
    }
}

function isDog(animal: Animal): animal is Dog {
    return (animal as Dog).breed !== undefined;
}

let a1 = new Animal("Tom");
let d1 = new Dog("Tony", "Poodle");

console.log(isDog(a1));  // false
console.log(isDog(d1));  // true

在上面的代码中,我们定义了一个 isDog 函数,它接受一个 Animal 类型的参数,返回值是一个布尔值。如果这个参数是 Dog 类型的实例,则返回 true;否则返回 false。注意,这里我们使用 animal is Dog 语法来显式地指定返回值类型为布尔值,表示这个函数就是一个类型谓词函数。

isDog 函数中,我们通过判断传入的 animal 参数是否含有 breed 属性,来判断它是否是 Dog 类型的实例。如果是,则返回 true;否则返回 false。

最后,我们可以通过调用 isDog 函数来判断一个对象是否是 Dog 类型的实例,并根据不同的类型执行相应的逻辑。


TypeScript支持的访问修饰符有哪些?

  • 公共(public),类的所有成员,其子类以及该类的实例都可以访问。

  • 受保护(protected),该类及其子类的所有成员都可以访问它们。 但是该类的实例无法访问。

  • 私有(private),只有类的成员可以访问它们。


如何定义一个数组,它的元素可能是字符串类型,也可能是数值类型?

 // 方法1:
let arr1: (number | string)[] = [1]
arr1.push(1)
arr1.push('3')

// 方法2:
let  arr2 : Array<string | number> = [1, '2']
arr2.push(1)
arr2.push('3')

// 方法3:
type newType = number|string
let arr3:newType []= [3]
arr3.push(1)
arr4.push('5')

Typescript中泛型是什么?

泛型程序设计(generic programming)是程序设计语言的一种风格或范式

泛型允许我们在强类型程序设计语言中编写代码时使用一些以后才指定的类型,在实例化时作为参数指明这些类型 在typescript中,定义函数,接口或者类的时候,不预先定义好具体的类型,而在使用的时候在指定类型的一种特性

假设我们用一个函数,它可接受一个 number 参数并返回一个 number 参数,如下写法:

function returnItem (para: number): number {
    return para
}

如果我们打算接受一个 string 类型,然后再返回 string类型,则如下写法:

function returnItem (para: string): string {
    return para
}

上述两种编写方式,存在一个最明显的问题在于,代码重复度比较高

虽然可以使用 any类型去替代,但这也并不是很好的方案,因为我们的目的是接收什么类型的参数返回什么类型的参数,即在运行时传入参数我们才能确定类型

这种情况就可以使用泛型,如下所示:

function returnItem<T>(para: T): T {
    return para
}

可以看到,泛型给予开发者创造灵活、可重用代码的能力

使用方式

  • 函数

  • 接口

函数声明
声明函数的形式如下:

function returnItem<T>(para: T): T {
    return para
}

定义泛型的时候,可以一次定义多个类型参数,比如我们可以同时定义泛型 T 和 泛型 U:

function swap<T, U>(tuple: [T, U]): [U, T] {
    return [tuple[1], tuple[0]];
}

swap([7,'seven']);//['seven', 7]

接口声明
声明接口的形式如下:

interface ReturnItemFn<T> {
    (para: T): T
}

那么当我们想传入一个number作为参数的时候,就可以这样声明函数:

const returnItem: ReturnItemFn<number> = para => para

类声明
使用泛型声明类的时候,既可以作用于类本身,也可以作用与类的成员函数

下面简单实现一个元素同类型的栈结构,如下所示:

class Stack<T> {
    private arr: T[] = []

    public push(item: T) {
        this.arr.push(item)
    }

    public pop() {
        this.arr.pop()
    }
}

使用方式如下:

const stack = new Stacn<number>()

如果上述只能传递 string 和 number 类型,这时候就可以使用 的方式猜实现约束泛型,如下所示:
在这里插入图片描述

除了上述的形式,泛型更高级的使用如下:

例如要设计一个函数,这个函数接受两个参数,一个参数为对象,另一个参数为对象上的属性,我们通过这两个参数返回这个属性的值

这时候就设计到泛型的索引类型和约束类型共同实现

索引类型、约束类型
索引类型 keyof T 把传入的对象的属性类型取出生成一个联合类型,这里的泛型 U 被约束在这个联合类型中,如下所示:

function getValue<T extends object, U extends keyof T>(obj: T, key: U) {
  return obj[key] // ok
}

上述为什么需要使用泛型约束,而不是直接定义第一个参数为 object类型,是因为默认情况 object 指的是{},而我们接收的对象是各种各样的,一个泛型来表示传入的对象类型,比如 T extends object

使用如下图所示:
在这里插入图片描述
多类型约束
例如如下需要实现两个接口的类型约束:

interface FirstInterface {
  doSomething(): number
}

interface SecondInterface {
  doSomethingElse(): string
}

可以创建一个接口继承上述两个接口,如下:

interface ChildInterface extends FirstInterface, SecondInterface {

}

正确使用如下:

class Demo<T extends ChildInterface> {
  private genericProperty: T

  constructor(genericProperty: T) {
    this.genericProperty = genericProperty
  }
  useT() {
    this.genericProperty.doSomething()
    this.genericProperty.doSomethingElse()
  }
}

TypeScript 的内置数据类型有哪些?

  • boolean:表示布尔值,可以是 true 或 false。
  • number:表示数字,包括整数和浮点数。
  • string:表示字符串。可以使用单引号或双引号来表示字符串。
  • void:表示没有任何返回值的函数的返回类型。
  • null 和 undefined:这两个类型是所有类型的子类型。 symbol:表示独特的值,类似于数字或字符串。

除此之外,TypeScript 还支持以下复合类型:

  • array:表示一个元素类型为 T 的数组。例如,number[] 表示一个数字数组。
  • tuple:表示已知元素数量和类型的数组。例如,[string, number] 表示一个字符串和数字组成的元组。
  • enum:表示一个命名的常量枚举。
  • any:表示任意类型。
  • unknown:与 any 类似,但是在更严格的类型检查下使用。
  • object:表示非原始类型的对象。
  • 还有一些其他的类型,例如 never、unionintersection,它们可以用于描述更复杂的类型。

ts中any和unknown有什么区别?

unknown 和 any 的主要区别是 unknown 类型会更加严格:在对 unknown 类型的值执行大多数操作之前,我们必须进行某种形式的检查。而在对 any 类型的值执行操作之前,我们不必进行任何检查。

举例说明:

let foo: any = 123;
console.log(foo.msg); // 符合TS的语法
let a_value1: unknown = foo;   // OK
let a_value2: any = foo;      // OK
let a_value3: string = foo;   // OK

let bar: unknown = 222; // OK 
console.log(bar.msg); // Error
let k_value1: unknown = bar;   // OK
let K_value2: any = bar;      // OK
let K_value3: string = bar;   // Error

因为bar是一个未知类型(任何类型的数据都可以赋给 unknown 类型),所以不能确定是否有msg属性。不能通过TS语法检测;而 unknown 类型的值也不能将值赋给 any 和 unknown 之外的类型变量

any 和 unknown 都是顶级类型,但是 unknown 更加严格,不像 any 那样不做类型检查,反而 unknown 因为未知性质,不允许访问属性,不允许赋值给其他有明确类型的变量。


如何将 unknown 类型指定为一个更具体的类型?

方法一

  • 使用 typeof 进行类型判断(这些缩小类型范围的技术都有助于TS基于控制流程下的类型分析)
  function unknownToString(value: unknown): string {
    if (typeof value === "string") {
     return value;
    }
  
    return String(value);
  }

方法二

  • 对 unknown 类型使用类型断言
    要强制编译器信任类型为 unknown 的值为给定类型,则可以使用类型断言:
  const value: unknown = "Hello World";
  const foo: string = value; // Error
  const bar: string = value as string; // OK

断言错了时语法能通过检测,但是运行的时候就会报错了!

  const value: unknown = "Hello World";

  const bar: number = value as number; // runtime Error

说说对 TypeScript 中命名空间与模块的理解?区别?

模块
TypeScript 与 ECMAScript 2015 一样,任何包含顶级 import 或者 export 的文件都被当成一个模块

相反地,如果一个文件不带有顶级的import或者export声明,那么它的内容被视为全局可见的

例如我们在在一个 TypeScript 工程下建立一个文件 1.ts,声明一个变量a,如下:

const a:number = 1;

然后在另一个文件同样声明一个变量a,这时候会出现错误信息
在这里插入图片描述
提示重复声明a变量,但是所处的空间是全局的

如果需要解决这个问题,则通过import或者export引入模块系统即可,如下:

const a:number = 10;

export default a

在typescript中,export关键字可以导出变量或者类型,用法与es6模块一致,如下:

export const a = 1
export type Person = {
    name: String
}

通过import 引入模块,如下:

import { a, Person } from './export';

命名空间
命名空间一个最明确的目的就是解决重名问题

命名空间定义了标识符的可见范围,一个标识符可在多个名字空间中定义,它在不同名字空间中的含义是互不相干的

这样,在一个新的名字空间中可定义任何标识符,它们不会与任何已有的标识符发生冲突,因为已有的定义都处于其他名字空间中

TypeScript 中命名空间使用 namespace 来定义,语法格式如下:

namespace SomeNameSpaceName {
   export interface ISomeInterfaceName {      }
   export class SomeClassName {      }
}

以上定义了一个命名空间 SomeNameSpaceName,如果我们需要在外部可以调用 SomeNameSpaceName 中的类和接口,则需要在类和接口添加 export 关键字

使用方式如下:

SomeNameSpaceName.SomeClassName

命名空间本质上是一个对象,作用是将一系列相关的全局变量组织到一个对象的属性,如下:

namespace Letter {
  export let a = 1;
  export let b = 2;
  export let c = 3;
  // ...
  export let z = 26;
}

编译成js如下:

var Letter;
(function (Letter) {
    Letter.a = 1;
    Letter.b = 2;
    Letter.c = 3;
    // ...
    Letter.z = 26;
})(Letter || (Letter = {}));

区别

  • 命名空间是位于全局命名空间下的一个普通的带有名字的 JavaScript 对象,使用起来十分容易。但就像其它的全局命名空间污染一样,它很难去识别组件之间的依赖关系,尤其是在大型的应用中

  • 像命名空间一样,模块可以包含代码和声明。 不同的是模块可以声明它的依赖

  • 在正常的TS项目开发过程中并不建议用命名空间,但通常在通过 d.ts 文件标记 js 库类型的时候使用命名空间,主要作用是给编译器编写代码的时候参考使用


ts中的枚举类型

在 TypeScript 中,枚举(Enum)类型是一种用来定义命名常量集合的数据类型。枚举类型可以帮助开发者更清晰地表达代码中的意图,提高代码的可读性和可维护性。

enum Gender {
    Male,
    Female
    Other
}
console.log(Gender.Male); // Output: 0

//We can also access an enum value by it's number value.
console.log(Gender[1]); // Output: Female

typeScript中的方法重写是什么?

如果子类(子类)具有与父类中声明的相同的方法,则称为方法覆盖。换句话说,在派生类或子类中重新定义基类方法。

方法重写的规则

  • 该方法必须具有与父类相同的名称
  • 该方法必须具有与父类相同的参数。
  • 必须有一个IS-A关系(继承)。

例子

class NewPrinter extends Printer {  
    doPrint(): any {  
        super.doPrint();  
        console.log("Called Child class.");  
    }  
    doInkJetPrint(): any {  
        console.log("Called doInkJetPrint().");  
    }  
}  
let printer: new () => NewPrinter;  
printer.doPrint();  
printer.doInkJetPrint();  

什么是TypeScript映射文件?

  • TypeScript Map文件是一个源映射文件,其中包含有关我们原始文件的信息。
  • .map文件是源映射文件,可让工具在发出的JavaScript代码和创建它的TypeScript源文件之间进行映射。
  • 许多调试器可以使用这些文件,因此我们可以调试TypeScript文件而不是JavaScript文件。

Typescript中 interface 和 type 的差别是什么?

  • 都可以描述一个对象或者函数

interface

interface User {
  name: string
  age: number
}

interface SetUser {
  (name: string, age: number): void;
}

type

type User = {
  name: string
  age: number
};

type SetUser = (name: string, age: number)=> void;

都允许拓展(extends)

interface 和 type 都可以拓展,并且两者并不是相互独立的,也就是说 interface 可以 extends type, type 也可以 extends interface 。 虽然效果差不多,但是两者语法不同。

interface extends interface

interface Name { 
  name: string; 
}
interface User extends Name { 
  age: number; 
}

type extends type

type Name = { 
  name: string; 
}
type User = Name & { age: number  };

interface extends type

type Name = { 
  name: string; 
}
interface User extends Name { 
  age: number; 
}

type extends interface

interface Name { 
  name: string; 
}
type User = Name & { 
  age: number; 
}

总结
语法形式:

  • interface:使用关键字 interface 定义,例如:interface Person { name: string; age: number; }
  • type:使用关键字 type 定义,例如:type Person = { name: string; age: number; }

扩展:

  • interface 可以被 extends 和 implements 扩展,可以继承另一个 interface。
  • type 可以使用交叉类型(&)将多个类型组合成一个类型。

兼容性:

  • interface 能够进行合并(merging),如果多次定义同名 interface,则会自动合并定义。
  • type 不具备合并功能,如果多次定义同名 type,则会报错。

适用范围:

  • 在一般情况下,interface 更适合用于定义对象的形状,而 type 更适合用于复杂的类型操作。

综合来说,interface 更倾向于用于描述对象的形状,能够进行合并和扩展,并且在大多数情况下更符合直觉。而 type 则更适合用于定义联合类型、交叉类型等较为复杂的类型操作。在实际开发中,可以根据具体需求和场景来选择使用 interface 还是 type。

说一说TypeScript中的类及其特性。

TypeScript 引入了类,以便它们可以利用诸如封装和抽象之类的面向对象技术的好处。

TypeScript 编译器将 TypeScript 中的类编译为普通的 JavaScript 函数,以跨平台和浏览器工作。

一个类包括以下内容:

  • 构造器(Constructor)
  • 属性(Properties)
  • 方法(Methods)
class Employee {
    empID: number;
    empName: string;
 
    constructor(ID: number, name: string) {
        this.empName = name;
        this.empID = ID;
    }
 
    getSalary(): number {
        return 40000;
    }
}

类的其他特性有:

  • 继承(Inheritance)
  • 封装(Encapsulation)
  • 多态(Polymorphism)
  • 抽象(Abstraction)

Typescript中什么是装饰器,它们可以应用于什么?

装饰器是一种特殊的声明,它允许你通过使用@注释标记来一次性修改类或类成员。每个装饰器都必须引用一个将在运行时评估的函数。

例如,装饰器@sealed将对应于sealed函数。任何标有 的@sealed都将用于评估sealed函数。

function sealed(target) {
  // do something with 'target' ...
}

它们可以附加到:

类声明

  • 方法
  • 配件
  • 特性
  • 参数

注意:默认情况下不启用装饰器。要启用它们,你必须experimentalDecorators从tsconfig.json文件或命令行编辑编译器选项中的字段。

TypeScript mixin。

Mixin 本质上是在相反方向上工作的继承。Mixins 允许你通过组合以前类中更简单的部分类设置来构建新类。

相反,类A继承类B来获得它的功能,类B从类A需要返回一个新类的附加功能。

后言

创作不易,要是本文章对广大读者有那么一点点帮助 不妨三连支持一下,您的鼓励就是博主创作的动力

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

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

相关文章

11-2 mybatis入门细节

mybatis Mybatis 单表CURD细节 ${} 与#{} 区别(面试题) ${} 拼接sql 造成sql注入 #{} 使用?占位 如果作为值, 推荐使用#{} ${} 实现一些动态排序,使用 #{column} select * from tb_userinfo order by ? desc column: id 赋值 sql: select * from tb_userinfo order by id …

AIGC,ChatGPT 快速批量处理Word文本内容

在文档编辑与创作的过程中,会避免不了,输入错误内容与打错字的情况。 如果我们一个一个手动去修改,会比较费时间。 如下: 进行内容修改与更新的时候,我们知道可以使用Ctrl+H 来查找与替换,但查找与替换一次也只能替换一个值。

博捷芯BJCORE:划片机在划切工艺中需要注意以下几点

划片机在划切工艺中需要注意以下几点&#xff1a; 1. 测高时工作台上不能有任何物品&#xff0c;以免影响测高精度。 2. 切割前检查参数是否正确选择&#xff0c;包括切割速度、切割深度等。 3. 更换刀片时&#xff0c;检查刀片是否平稳旋转&#xff0c;确保刀片安装牢固。 …

开发知识点-stm32/ESP32/Mega2560嵌入式设计

嵌入式设计 STM32四轴飞行器原理图解析小马哥 DragonFly四轴软件开发 13 STM32 SPI总线通讯SPI 总线协议简介SPI 物理层SPI 协议层SPI 通信时序 STM32硬件SPI接口简介SPI接口 利用库函数初始化配置 ESP32 “F:\res\marlin-2.0.x” “F:\res\Marlin-2.1.2” STM32四轴飞行器 小…

深度学习中的“钩子“(Hook):基于pytorch实现了简单例子

目录 基本概念一个详细的示例 基于resnet50的一个hook应用例子前向传播示例反向传播示例 基本概念 在深度学习中&#xff0c;“钩子”&#xff08;Hook&#xff09;是一种机制&#xff0c;可以在神经网络的不同层或模块中插入自定义的代码&#xff0c;以便在网络的前向传播或反…

python开发数字人助理版

Fay数字人助理版是fay开源项目的重要分支&#xff0c;专注于构建智能数字助理的开源解决方案。它提供了灵活的模块化设计&#xff0c;使开发人员能够定制和组合各种功能模块&#xff0c;包括情绪分析、NLP处理、语音合成和语音输出等。Fay数字人助理版为开发人员提供了强大的工…

第三章《补基础:不怕学不懂概率统计》笔记

3.1 什么是概率 概率亦称“或然率”&#xff0c;它反映随机事件出现的可能性大小&#xff0c;在现实生活中有着极其普遍的应用。 3.1.1 最简单的概率的例子 3.1.2 概率论与数理统计的关系 概率论与数理统计的关系可以概括为&#xff0c;概率论是数理统计的理论基础&#xf…

fastspar微生物相关性推断

fastspar 简介 fastspar是基于Sparcc通过C编写的&#xff0c;速度更快&#xff0c;内存消耗更少。sparcc是基于OTU的原始count数&#xff0c;通过log转换和标准化去除传统相对丰度的天然负相关&#xff08;因为所有OTU之和为1&#xff0c;某些OTU丰度高另外一些自然就少&…

nssm部署nginx

nssm install Nginx8098 --安装nginx nssm start Nginx8098 --启用nginx nginx 选择nginx路径&#xff0c;安装

Kyligence Copilot 亮相第六届进博会,增添数智新活力

11月5日&#xff0c;第六届中国国际进口博览会&#xff08;以下简称“进博会”&#xff09;在上海国家会展中心盛大启幕&#xff0c;众多新科技、新成果、新展品亮相本届进博会。作为阿斯利康&#xff08;AstraZeneca&#xff09;合作伙伴&#xff0c;跬智信息&#xff08;Kyli…

ApiFox添加全局参数

文章目录 Apifox右上角打开 管理环境Apifox右上角打开 管理环境 我们发现,从登录以后,在请求其他接口,每次都需要添加一个Header 头信息.这样很繁琐.那Apifox是否支持我们设置全局参数呢?方便我们每次调用需要添加Header参数的接口需要每次都重新编写.当然支持,下面带着大家配…

Hikyuu 1.3.0 发布,高性能量化交易研究框架

Hikyuu 是一款基于 C/Python 的高性能开源量化交易研究框架&#xff0c;用于快速策略分析及回测。与其他量化平台或回测软件相比&#xff0c;具备&#xff1a; 超快的回测速度&#xff1b;对完整的系统交易理念进行抽象&#xff0c;并分解为不同的组件&#xff0c;通过重用不同…

Redis被攻击纪实

一、前言 声明&#xff1a;本文仅供技术交流使用&#xff0c;严禁采用本文的方法进行任何非法活动。 上周新来的同事分享Redis的原理和机制&#xff0c;想起2017年的时候测试环境Redis被攻击&#xff0c;最后只能重新安装服务器&#xff0c;今天试验一把利用Redis漏洞进行攻击…

Hybrid综合应用

1、需求 实现不同vlan间PC不可互访&#xff0c;而不同vlan的PC均可访问服务器的特殊效果&#xff0c;具体要求如下。 1&#xff09;在交换机中创建相关vlan 2&#xff09;修改端口模式与pvid 3&#xff09;修改端口允许通过的数据帧 4&#xff09;结果验证&#xff0c;vlan5与…

docker搭建mysql环境

1. 基础环境 名称描述CentOS 7.6Linux操作系统版本docker 20.10.5docker版本mysql 8.0.29mysql镜像版本 2. 下载安装 使用docker命令下载mysql镜像 [rootzhouwei ~]# docker pull mysql:8.0.29查看docker仓库是否已经下载了mysql镜像 [rootzhouwei ~]# docker images将mys…

一体化HIS医疗信息管理系统源码:云HIS、云电子病历、云LIS

基于云计算技术的B/S架构的HIS系统&#xff0c;为医疗机构提供标准化的、信息化的、可共享的医疗信息管理系统&#xff0c;实现医患事务管理和临床诊疗管理等标准医疗管理信息系统的功能。系统利用云计算平台的技术优势&#xff0c;建立统一的云HIS、云病历、云LIS&#xff0c;…

Android:OkHttp同步请求和异步请求

一、前言 网络请求之前工作中用到的是post请求&#xff0c;然后了解之后发现请求的种类还有很多种。下面着重讲到是get和post的同步请求和异步请求。 二、具体内容 1.Okhttp的特点&#xff1a; 支持Http/2并允许对同一主机的所有请求共享一套接字&#xff1b;如果非HTTP/2&…

jenkins2

jenkins插件管理安装&#xff1a;docker-build jenkins安装了docker 配置docke builder 添加 unix:///var/run/docker.sock rootubuntu20:~# usermod -G docker jenkins 修改docker中service文件添加 -H tcp://0.0.0.0:2376 jenkins中系统管理中 tcp://localhost:2376

不同规模的企业如何借助宁盾LDAP统一用户认证实现安全和效率需求?

中小企业要解决安全和业务效率问题&#xff0c;须提前规划软件基础设施&#xff0c;其中最基础的部分是建立统一账号和统一用户身份认证体系。这个体系相当于在软件系统之间建立了一套统一的身份标准&#xff0c;基于这套标准创建的账号让员工方便、高效地访问公司内的大部分软…

项目文件下载器,基于Thread多线程

目录 1、Http 工具类 2、关于下载的关系类 2.1 展示下载信息 #下载信息展现线程类 #在主下载类中&#xff0c;进行调用上述线程类 2.2 文件的分块下载 #文件分块下载类 #文件按分块进行分别切分的方法 # 使用 LongAdder 类型&#xff0c;更改 DownLoadInfoThread 展现…