[学习笔记]TypeScript查缺补漏(一):类

2023-11-01 00:20

本文主要是介绍[学习笔记]TypeScript查缺补漏(一):类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 基础知识
    • 创建类型
    • 类的初始化
    • 类型和值
    • JSDoc 注释
    • 字段
      • 私有字段
      • 可选和非可选字段
      • 字段类型约束
    • Getter/Setter
    • 静态成员
    • 函数重载
    • 构造函数
      • 参数属性
    • 类的实例化
  • 箭头函数
    • this的作用域
      • 全局
      • 类和对象方法
  • 泛型
    • 泛型类
    • 泛型接口
    • 泛型函数
  • 装饰器

基础知识

创建类型

class Abc { }

类的初始化

const abc = new Abc();

类型和值

类既可以作为类型使用,也可以作为值使用。


const a:Bag = new Bag()

JSDoc 注释

JSDoc 是 JavaScript 的一种注释规范,它使用特定的注释格式来自动生成 API 文档。JSDoc 通过注释来提取信息,例如函数名、参数类型和返回类型等,然后使用这些信息生成人类可读的文档。

示例:

/**  * 这是一个函数注释  * @param {string} 参数名 - 参数描述  * @returns {number} 返回值描述  */  
function myFunction(参数名) {  // 函数实现  return 0;  
}

在这个例子中,/** 开始一个多行注释,然后在注释中使用 @param 和 @returns 来描述函数的参数和返回值。JSDoc 还支持其他注释标签,例如 @description、@type 和 @example 等。

字段

class User extends Account implements Updatable, Serializable {id: string;                     //普通字段displayName?: boolean;          //可选字段name!: string;                  //非可选字段#attributes: Map<any, any>;    //私有字段roles = ["user"];               //有默认值的字段readonly createdAt = new Date() // 带有默认值的只读字段
}

私有字段

class Foo {  private myAny = 1;  
}  class Bar {  #myAny = 1;  
}

私有成员只能在它们所属的类内部访问,类的外部无法直接访问这些私有成员。

示例:

class MyClass {  #myPrivateVariable: string;  public myPublicMethod() {  console.log(this.#myPrivateVariable); // 正确,可以在类内部访问私有成员  }  
}  const obj = new MyClass();  
console.log(obj.#myPrivateVariable); // 错误,私有成员无法从外部访问

区别
private在编译后JavaScript中没有影响,仅对TypeScript编译器有影响,而使用#符号声明的私有属性在JavaScript中会被编译为常规的私有属性。

可选和非可选字段

感叹号(!)用于标记属性或方法为非可选(non-optional)。这意味着该属性或方法在类实例化时必须提供值,否则将导致编译错误。

class Person {  constructor(public name: string, public age: number!) {  }  
}  const person = new Person("Alice", 25); // 正确,age 属性必须提供值  
const personOptional = new Person("Bob"); // 错误,age 属性未提供值

问号(?)用于标记属性或方法为可选(optional)。这意味着该属性或方法在类实例化时可以省略,不会导致编译错误。

class Person {  constructor(public name: string, public age?: number) {  }  
}  const person = new Person("Alice"); // 正确,age 属性未提供值  
const personOptional = new Person("Bob", 25); // 正确,age 属性提供了值

字段类型约束

[key: string]: number; 是一种对象类型的写法,表示对象的键是字符串类型,值是数字类型。

示例:

const person: { [key: string]: number } = {  age: 25,  height: 170,  weight: 65  
};

Getter/Setter

Getter 是一个获取属性的方法,Setter 是一个设置属性的方法。可以使用 get 和 set 关键字来定义它们。
Getter/Setter可以在不改变属性的访问权限的情况下,对属性的值进行更精细的控制。比如可以在读取或设置属性的值时添加额外的逻辑。

class Person {  private _name: string;  get name(): string {  return this._name;  }  set name(value: string) {  this._name = value;  }  
}  let person = new Person();  
person.name = "John"; // 使用 setter 设置值  
console.log(person.name); // 使用 getter 获取值,输出 "John"

静态成员

静态方法中this指向类本身,而不是类的实例对象。

class StaticClass {  n?:number=4;//静态字段static s:number//静态方法static staticMethod() {  this.s=5console.log('This is a static method');  }  
}StaticClass.staticMethod(); // 调用静态方法
var staticClass=new StaticClass();
console.log(staticClass.n)     //类成员不受影响 ,输出4
console.log(staticClass.s)     //undefined console.log(StaticClass.n)     //undefined
console.log(StaticClass.s)     //静态类成员不受影响 ,输出5

函数重载

在 TypeScript 中,可以使用函数重载(Function Overloading)来定义多个同名函数,它们具有不同的参数类型或参数数量。这可以帮助提高代码的可读性和可用性。

要实现函数重载,需要遵循以下规则:

  1. 重载的函数必须同名。
  2. 重载的函数参数类型或数量必须不同。
  3. 重载的函数可以有一个或多个重载。
  4. 函数重载不能改变函数的返回类型。

示例:

  update: (retryTimes: number) => void;update(retryTimes: number): void;

构造函数

构造函数是用于创建和初始化对象实例时候被调用的特殊方法,用于初始化对象的属性并为其分配内存空间。

示例:

class Person {  private name: string;  private age: number;  constructor(name: string, age: number) {  this.name = name;  this.age = age;  }  greet() {  console.log(`名字 ${this.name} 年龄 ${this.age}`);  }  
}  var person = new Person("John", 30);  
person.greet(); // 输出 "名字 John 年龄 30" 

参数属性

可以使用参数属性(Parameter Properties)来在类中定义与函数参数相关的属性。参数属性提供了一种简洁的方式来声明与函数参数相关的属性,而不需要显式地使用 this 关键字。

示例:

class Person {  constructor(public name: string, public age: number) {}  
}var person = new Person("John", 30);  
console.log(person.name); // 输出 "John"  
console.log(person.age); // 输出 30

类的实例化

  (): JSONResponse              //  可以通过 () 调用这个对象 -(JS中的函数是可以调用的对象) new(s: string): JSONResponse; // 可以在此类对象上使用 new

示例:实例化泛型对象

class Person {  age= 25;height= 170;  weight= 65;constructor() {  }  
}  class PersonService<TService> {Service?: TService;Init(service?: { new(): TService }) {if (service != null) {this.Service = new service();}}
}var p = new PersonService<Person>(); 
p.Init(Person);
console.log(p.Service?.age);  // 25
console.log(p.Service?.height);  // 170
console.log(p.Service?.weight);  // 65

箭头函数

在箭头函数中,this不指向调用该函数的对象,而是指向定义该箭头函数时的上下文。
尽管箭头函数是在对象的方法中定义的,但是它不会捕获到调用该方法的对象作为自己的this上下文。

示例:

let obj = {  value: "I am an object",  printValue: () => { console.log(this.value); }  
}  obj.printValue(); // 输出:"I am an object"

this的作用域

全局

在全局作用域或单独的函数作用域中,this引用的是全局对象。

console.log(this); // 在全局作用域中输出:window对象  function testFunc() {  console.log(this); // 在函数作用域中输出:window对象  
}  testFunc();

类和对象方法

当函数作为对象的方法被调用时,this指的是obj对象。

let obj = {  name: 'Example Object',  printName: function() {  console.log(this.name);   }  
}  obj.printName(); // 输出:"Example Object"

当调用类中的函数时,this指的是类的实例对象。

class MyClass {  myMethod() {  console.log(this); // 输出:MyClass的实例对象  }  
}  const obj = new MyClass();  
obj.myMethod();

泛型

泛型是一种允许你在定义类、接口、函数和方法时使用类型参数的功能。泛型允许你编写灵活的代码,同时保持类型安全。通过使用泛型,你可以在强类型环境中编写可重用的代码,而无需担心具体的类型实现细节。

泛型类


class Box<Type>{contents?: Typeconstructor(value: Type) {this.contents = value;
}}var stringBox = new Box("a package");
console.log(stringBox.contents) // a package

泛型接口

interface Generator<T> {  generate(): T;  
}  class RandomNumberGenerator implements Generator<number> {  generate() {  return Math.random();  }  
}  let generator = new RandomNumberGenerator();  
let randomNumber = generator.generate(); // 类型为 number

泛型函数

function identity<T>(arg: T): T {  return arg;  
}  let x = identity<number>(123); // 类型为 number  
let y = identity<string>("hello"); // 类型为 string

装饰器

装饰器是使用 @ 符号来标识的特殊类型的函数,可以用来扩展类或方法的行为。实现类似面向切面编程的特性。

可以在类、类方法、访问器、属性和方法参数上使用装饰器

示例:

function log(target: any, obj:any) {  console.log(target)console.log(`Creating instance of ${target.name}`);  
}  @log  
class MyClass {  myMethod() {  console.log("Hello, World!");  }  
}  const instance = new MyClass();

TypeScript示例可在https://www.typescriptlang.org/play中调试

这篇关于[学习笔记]TypeScript查缺补漏(一):类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/319141

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

线性代数|机器学习-P36在图中找聚类

文章目录 1. 常见图结构2. 谱聚类 感觉后面几节课的内容跨越太大,需要补充太多的知识点,教授讲得内容跨越较大,一般一节课的内容是书本上的一章节内容,所以看视频比较吃力,需要先预习课本内容后才能够很好的理解教授讲解的知识点。 1. 常见图结构 假设我们有如下图结构: Adjacency Matrix:行和列表示的是节点的位置,A[i,j]表示的第 i 个节点和第 j 个

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件