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

这篇具有很好参考价值的文章主要介绍了[学习笔记]TypeScript查缺补漏(一):类。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

基础知识

创建类型

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中调试文章来源地址https://www.toymoban.com/news/detail-739265.html

到了这里,关于[学习笔记]TypeScript查缺补漏(一):类的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • TypeScript 学习笔记(一):类型

    TS中实现对象属性必选、对象属性在开发过程中十分常见,前端在传参数时,有些参数比必传,有些是选传,我们可以定一个多个对象来实现传参,但是这让代码变得冗余。我们可以通过TS定义数据类型来实现。 TypeScript中文网 1. 数组 2. 布尔 3. 数值 当我们给num赋值为123但没有

    2024年02月13日
    浏览(41)
  • Typescript学习笔记(1.0)

    typescript是由微软开发的自由和开源的编程语言。 typescript是JavaScript的一个超集,就是说JavaScript的语法typescript全部支持,并且在JavaScript进行了扩充,并在JavaScript的基础上进行了变量、函数、返回值等类型限制。 首先,是安装typescript。因为他需要编译,需要首先安装Node.js。

    2023年04月09日
    浏览(44)
  • TypeScript学习笔记(二)

    字符串字面量类型用来约束取值只能是某几个字符串中的一个 数组:同一类型的集合 元祖:不同类型的集合 枚举使用 enum 来定义 枚举成员会被赋值为从 0 开始递增的数字,同时也会对枚举值到枚举名进行反向映射 可以给枚举项手动赋值: 未手动赋值的枚举项与手动

    2023年04月09日
    浏览(42)
  • typeScript 学习笔记(二)

    类接口 · TypeScript 入门教程 (xcatliu.com) ① 类 类:定义了一件事物的抽象特点,包含它的属性和方法 对象:类的实例,通过new生成 面向对象(OOP)的三大特性:封装、继承、多态 封装(Encapsulation):将对数据的操作细节隐藏起来,只暴露对外的接口。外界调用端不需要(也

    2024年02月09日
    浏览(47)
  • TypeScript学习笔记

    let num [ :number ] = 10; // 以冒号加类型的方式,声明变量 1.2.1 基本类型 1 number 2 string 3 boolean 4 null 5 undifined 1 数值 number  let num : number = 10;  二进制 = 0b 1010; 八进制 = 0o 18; 十六进制 = 0x abc; 2 字符串 string 例 let str: string = \\\'abc\\\'; 3 布尔 boolean // let flag: boolean = true; 4 空 null // let nul:

    2024年02月12日
    浏览(34)
  • 【TypeScript】基础知识学习笔记

    TypeScript的特点: JavaScript的超集,满足所有的JS语法 含有面向对象的静态类型 起步安装:1、npm i typescript -g 2、tsc 文件名 一、TS的基本数据类型 基本数据类型:number、boolean、string、undefined、null、symbol、bigint、void 当中的类型有大小写的区分:大写的类型是给对象使用,小写

    2024年02月09日
    浏览(56)
  • TypeScript 学习笔记(四):类型守卫

    类型守卫的作用在于触发类型缩小。实际上,它还可以用来区分类型集合中的不同成员 类型守卫包括switch、字面量恒等、typeof、instanceof、in 和自定义类型守卫 简单说当一个类型是多种可能时例如’any’,‘unknown’,‘联合类型’ 等在逻辑判断时候要具体到其唯一子集可能性

    2024年02月15日
    浏览(55)
  • TypeScript 学习笔记(七):条件类型

    TS中的条件类型就是在类型中添加条件分支,以支持更加灵活的泛型,满足更多的使用场景。内置条件类型是TS内部封装好的一些类型处理,使用起来更加便利。 当T类型可以赋值给U类型时,则返回X类型,否则返回Y类型。 T U X Y 四个是占位符,分别表示四种类型; T extends U

    2024年02月17日
    浏览(39)
  • CSS查缺补漏之《如何优雅解决margin垂直方向塌陷与合并问题?》

    一:父子元素之间margin垂直方向塌陷问题 在处理margin垂直方向问题时,经常会遇到在给子元素设置margin时,导致效果出现在了父元素上;如下代码所示: 代码原义是想实现三方面: ① 将box1的margin-top调为50px,使其与父元素之间形成空隙; ② 将box2的margin-top调为20px,使其与

    2024年02月10日
    浏览(51)
  • 【鸿蒙系统学习笔记】TypeScript开发语言

    HarmonyOS 应用的主要开发语言是 ArkTS,它由 TypeScript(简称TS)扩展而来,在继承TypeScript语法的基础上进行了一系列优化,使开发者能够以更简洁、更自然的方式开发应用。值得注意的是,TypeScript 本身也是由另一门语言 JavaScript 扩展而来。因此三者的关系如下图所示 2.1.1、线

    2024年02月19日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包