[学习笔记]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=5
        console.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?: Type
    constructor(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中调试

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

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

相关文章

dash--项目的前端展示简单基础

1.前置工作 创建虚拟环境&#xff1a; sudo apt-get install python3-venv # 安装 python3 -m venv venv # 在本目录下创建venv虚拟环境&#xff08;也是一个文件夹。如果用不到这个虚拟环境以后就rm -rf venv&#xff09; source venv/bin/activate # 激活虚拟环境临时使用清华…

C语言实现贪吃蛇小游戏

#include <stdio.h> #include <easyx.h> #include <iostream> #include <math.h> #include <stdlib.h> #include <conio.h> #include <time.h> #define PI 3.14 #define NODE_WIDTH 40 //绘制蛇的节点 typedef struct {int x;int y;…

vue中electron与vue通信(fs.existsSync is not a function解决方案)

electron向vue发送消息 dist/main.js (整个文件配置在另一条博客里) win new BrowserWindow({width:1920,height:1080,webPreferences: {// 是否启用Node integrationnodeIntegration: true, // Electron 5.0.0 版本之后它将被默认false// 是否在独立 JavaScript 环境中运行…

三.RocketMQ单机安装及集群搭建

RocketMQ单机安装及集群搭建 一&#xff1a;安装环境1.软硬件要求2.下载RocketMQ 二.安装单机MQ1.上传并解压2.目录介绍3.修改MQ启动时初始JVM内存4.启动NameServer与Broker5.测试RocketMQ 三.RocketMQ集群搭建1.集群概念特点2.集群模式分类3.集群工作流程4.双主双从集群搭建4.…

GORM:在Go中轻松管理数据库

GORM综合介绍 - Go对象关系映射库 在现代软件开发中&#xff0c;高效的数据库管理对于构建强大的应用程序至关重要。GORM是Go开发人员寻求与数据库进行交互的简化方式的宝贵工具。GORM是Go对象关系映射的缩写&#xff0c;它为Go的面向对象世界与数据库的关系世界之间提供了桥梁…

小红书协议算法最新版

如果您想通过学习来了解小红书的点赞、关注、私信等功能的实现&#xff0c;以下是一些一般性的思路和示例代码&#xff0c;供您学习参考&#xff1a; 1. 点赞功能&#xff1a; - 后端实现&#xff1a;在后端&#xff0c;您可以创建一个用于存储用户点赞信息的数据库表。对于每…

测试遇到bug怎么分析,这可能是我看到最专业的总结了!

为什么定位问题如此重要&#xff1f; 可以明确一个问题是不是真的“bug” 很多时候&#xff0c;我们找到了问题的原因&#xff0c;结果发现这根本不是bug。原因明确&#xff0c;误报就会降低多个系统交互&#xff0c;可以明确指出是哪个系统的缺陷&#xff0c;防止“踢皮球”&…

Qlik Sense Enterprise 忘记PostgreSQL密码

在 Windows 上安装 Qlik Sense Enterprise 期间会提供密码。如果您忘记了该密码&#xff0c;则无法找回&#xff1b;但是&#xff0c;可以按照以下步骤重置密码。 如何在 Qlik 中重置忘记的 PostgreSQL 密码... - Qlik Community - 1712725 如果该过程完成后记录了密码错误的…

Python开发技能实战-通过配置的代理服务器在具有外网连接的环境中在Pycharm中运行python代码

实现功能 打开科学上网工具&#xff0c;使得能够在浏览器科学上网&#xff0c;通过科学上网工具的配置文件&#xff0c;可以看出本地和远程代理的映射关系&#xff0c;此时&#xff0c;远程地址本地地址&#xff0c;远程端口本地端口。 1、在程序中配置请求网页代理请求。不需…

Http代理与socks5代理有何区别?如何选择?(二)

上篇文章我们基本分别了解了http代理与socks5代理的定义与优缺点&#xff0c;接下来我们继续来了解http代理与socks5代理之间的比较与区别。 一、两者的比较 1、功能比较 HTTP代理专门用于Web流量&#xff0c;并在处理HTTP和HTTPS协议方面非常高效。它们可以修改正在传输的数据…

解析mfc100u.dll文件丢失的修复方法,快速解决mfc100u.dll问题

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中最常见的就是“缺少某个文件”的错误。最近&#xff0c;我也遇到了一个这样的问题&#xff0c;那就是“mfc100u.dll丢失”。这个问题可能会导致某些应用程序无法正常运行&#xff0c;给我们带来困扰。…

ANGR初识

首页&#xff1a; https://angr.io 项目存储库&#xff1a; GitHub - angr/angr: A powerful and user-friendly binary analysis platform! 文档&#xff1a; https://docs.angr.io API 文档&#xff1a; angr documentation 练习项目&#xff1a; https://github.com/angr/an…

Python的web自动化学习(五)Selenium的隐式等待(元素定位)

引言&#xff1a; WebDriver隐式等待是一种全局性的等待方式&#xff0c;它会在查找元素时设置一个固定的等待时间。当使用隐式等待时&#xff0c;WebDriver会在查找元素时等待一段时间&#xff0c;如果在等待时间内找到了元素&#xff0c;则立即执行下一步操作&#xff1b;如果…

Windows下多Chrome谷歌浏览器版本共存

场景 某些年代久远的 WEB 应用&#xff0c;必须在指定的浏览器或版本才能正常运行&#x1f602;&#xff0c;此时就需要多个版本 chrome 浏览器共存。 解决方案 下载指定版本 可以从 https://www.chromedownloads.net/ 下载需要的版本&#xff0c;此处下载的是87.0.4280.14…

【MySQL索引与优化篇】数据库设计实操(含ER模型)

数据库设计实操&#xff08;含ER模型&#xff09; 文章目录 数据库设计实操&#xff08;含ER模型&#xff09;1. ER模型1.1 概述1.2 建模分析1.3 ER 模型的细化1.4 ER 模型图转换成数据表1. 一个实体转换成一个数据库表2. 一个多对多的关系转换成一个数据表3. 通过外键来表达1对…

VS2019 C# mysql数据库使用EF

mysql 安装mysql-8.0.18-winx64 mysql-connector-net-8.0.18.msi mysql数据库.net开发驱动&#xff0c; 要在工程中引入connector安装后目录中的mysql.data.dll;如果直接在nutget中下载mysql.data.dll&#xff0c;那么就不用下载.net开发驱动包 mysql-for-visualstudio-1.…

oracel处理XML时,报ORA-31011、ORA-19202。

原字段为clob&#xff0c; 查询 SELECT XMLTYPE(字段) FROM TABLE_A报错如下&#xff1a; ORA-31011: XML 语法分析失败 ORA-19202: XML 处理 LPX-00217: invalid character 12 (U000C) Error at line 1559时出错 ORA-06512: 在 "SYS.XMLTYPE", line 272 ORA-0651…

嵌入式到底如何理解呢?

今日话题&#xff0c;嵌入式到底如何理解呢&#xff1f;以我个人的理解&#xff0c;可以用一个客观的比喻来描述&#xff0c;就是将某个系统嵌入到特定的环境中&#xff0c;以实现特定的功能。这个过程包括将现实世界中的人、物的意图和逻辑关系&#xff0c;通过计算和运算的方…

【2023年MathorCup高校数学建模挑战赛-大数据竞赛】赛道A:基于计算机视觉的坑洼道路检测和识别 python 代码解析

【2023年MathorCup高校数学建模挑战赛-大数据竞赛】赛道A&#xff1a;基于计算机视觉的坑洼道路检测和识别 python 代码解析 1 题目 坑洼道路检测和识别是一种计算机视觉任务&#xff0c;旨在通过数字图像&#xff08;通常是地表坑洼图像&#xff09;识别出存在坑洼的道路。这…

栅栏密码fence cypher

f{_wi3_hlyk_lnceaonr_cirgu04fep} flag{you_kn0w_r4il_f3nce_cipher}
最新文章