返回顶部
首页 > 资讯 > 前端开发 > JavaScript >TypeScript中的函数和类你了解吗
  • 143
分享到

TypeScript中的函数和类你了解吗

2024-04-02 19:04:59 143人浏览 独家记忆
摘要

目录函数作为参数定义函数函数参数的类型可选类型参数默认值剩余参数this的默认推导函数重载类初始化继承多态成员修饰符总结函数 以下声明了一个函数类型,通过type来定义类型别名,vo

函数

以下声明了一个函数类型,通过type来定义类型别名,void 表示没有返回值

type fnType = () => void;

作为参数

函数可以作为参数,传递到另一个函数中

type fnType = () => void;
function foo(fn: fnType) {
  fn();
}
function bar() {
  console.log("bar");
}
foo(bar);      // bar

js代码不同的点在于传入的参数需要定义类型注解

定义函数

定义函数的时候,需要给入参指定类型注解,返回值如果可以自行推导出来,也可以不写,如 add 和 minus 函数,但是作为参数时,是必须要写的,如 calc 函数中的入参 fn

function add(num1: number, num2: number): number {
  return num1 + num2;
}
function minus(num1: number, num2: number): number {
  return num1 - num2;
}
function calc(
  num1: number,
  num2: number,
  fn: (num1: number, num2: number) => void
) {
  console.log(fn(num1, num2));
}
calc(30, 20, add);      // 50
calc(30, 20, minus);      // 10

函数参数的类型

ts中函数会规定参数的类型和个数,当个数不确定时,可以使用可选类型、剩余参数、默认值

可选类型

可选类型相当于该定义的类型和undefined的联合类型,所以参数有三种选择、传入该类型、不传或者undefined

function foo(x: number, y?: number) {
  console.log(x, y);
}
foo(1, 2);      // 1 2
foo(3);      // 3 undefined
foo(4, undefined);      // 4 undefined

参数默认值

参数设置了默认值就使之称为了可选类型,不过有默认值的参数最好放在必传参数后面

function baz(x: number = 20, y: number) {
  console.log(x, y);
}
baz(10, 20);      // 10 20
baz(undefined, 20);      // 20 20

剩余参数

剩余参数要放在必传参数之后

function sum(num: number, ...args: number[]) {
  console.log(num, args);
}
sum(10);      // 10 []
sum(10, 20);      // 10 [20]
sum(10, 20, 30);      // 10 [20, 30]

this的默认推导

在对象的方法中定义的this,ts是可以自动推导的,但是独立函数中的this,是推导不出来的。

在这里插入图片描述

必须要在独立函数中定义this的类型

type ThisType = { name: string };
const eating = function (this: ThisType) {
  console.log(this.name + " eating~");
};
const person = {
  name: "kiki",
  eating,
};
person.eating()

函数重载

函数重载指的是函数名相同,参数个数或者类型不同,所定义的多个处理方法。

比如需要对字符串拼接或者数字求和操作,虽然我们知道 + 号可以用在字符串和数字上,但是在类型检测严格的ts代码中,这样写编译是不通过的,需要使用【类型缩小】,缩小类型的判断,再进行处理。

在这里插入图片描述

通过联合类型,参数组合的可能性越多,需要越多的if语句来进行判断,并且函数的返回值类型也是未知的,在这种情况下可以使用【函数重载】

在ts中,定义函数名和参数类型的重载函数,再通过实现函数来定义具体实现。 会根据数据类型在重载函数中调用,再执行实现函数的代码。

function add(x: number, y: number): number;
function add(x: string, y: string): string;
function add(x: any, y: any) {
  return x + y;
}
console.log(add(1, 2));
console.log(add("a", "b"));

如果传递的参数与重载函数中定义参数不同,是无法通过编译的。

在这里插入图片描述

初始化

类中定义的变量需要初始化,可以在定义类的时候就赋值或者通过constructor来操作

class Person {
  name: string;
  age: number;
  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }
}
const person = new Person("alice", 20);

继承

ts和js中一致,都是通过 extends 实现继承,使用父级参数和方法时使用 super 关键字。

class Person {
  name: string;
  age: number;
  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }
}
class Student extends Person {
  sno: number;
  constructor(name: string, age: number, sno: number) {
    super(name, age);
    this.sno = sno;
  }
}
const student = new Student("alice", 20, 1);

多态

使用多态可以写出更加具备通用性的代码,如果想要实现多态首先得有继承,并且父类引用指向子类对象。

class Animal {
  action() {
    console.log("animal action");
  }
}
class Dog extends Animal {
  action() {
    console.log("dog running");
  }
}
class Fish extends Animal {
  action() {
    console.log("fish swimming");
  }
}
function doAction(animals: Animal[]) {
  animals.forEach((animal) => {
    animal.action();
  });
}
doAction([new Dog()]);
doAction([new Dog(), new Fish()]);
doAction([new Dog(), new Fish(), new Animal()]);

这里相当于 const animal1: Animal = new Dog() ,看起来是 Animal 对象,其实是 Dog 对象,这里的父类引用指向的是子类对象,所以最后执行的是 Dog 对象的方法

在这里插入图片描述

成员修饰符

成员修饰符有以下三种

  • public 表示共有的,任何地方都可见,当没有定义成员修饰符时,默认为public
  • private 私有的,只有类中能够访问到
  • protected 被保护的,表示类自身和子类可以访问到

public

class Person {
  public username: string = "alice";
  getName() {
    return this.username;
  }
}
const person = new Person();
console.log(person.username);

private

通过private修饰的变量,在实例对象上也是不可访问的。

在这里插入图片描述

protected

通过protected修饰的变量,在实例对象上也是不可访问的。

在这里插入图片描述

readonly

readonly表示该属性只读,初始化了之后就不能以任何方式修改,无论是在类内部,还是修改实例对象,但当它是一个对象时,只要不改变它的内存地址,修改对象的属性是可以的。

在这里插入图片描述

访问器

访问器给私有属性提供get/set方法,让我们在类外部获取/修改私有属性

class Person {
  private _name: string;
  constructor(newName: string) {
    this._name = newName;
  }
  get name() {
    return this._name;
  }
  set name(newName) {
    if (newName) this._name = newName;
  }
}
const person = new Person("alice");
console.log(person.name);
person.name = "kiki";
console.log(person.name);
person.name = "";
console.log(person.name);

通过get/set属性来修改私有属性可以做到拦截/判断的作用

在这里插入图片描述

静态成员

静态成员通过 static 关键字来定义,通过 static 定义的属性,是定义在类自身的,只能通过自己访问,在类内部和实例对象都是无法访问到的。

在这里插入图片描述

抽象类

在定义很多通用的调用接口时,我们通常会让调用者传入父类,通过多态来实现更加灵活的调用方式。

但是,父类本身可能并不需要对某些方法进行具体的实现,所以父类中定义的方法, 我们可以定义为抽象方法。

abstract class Shape {
  abstract getArea(): void;
}
class Circle extends Shape {
  private radius: number;
  constructor(radius: number) {
    super();
    this.radius = radius;
  }
  getArea() {
    return this.radius * this.radius * 3.14;
  }
}
class Rectangle extends Shape {
  private width: number;
  private height: number;
  constructor(width: number, height: number) {
    super();
    this.width = width;
    this.height = height;
  }
  getArea() {
    return this.width * this.height;
  }
}
function calcArea(shape: Shape) {
  return shape.getArea();
}
console.log(calcArea(new Circle(3)));
console.log(calcArea(new Rectangle(2, 6)));

抽象方法和方法通过 abstract 来修饰,并且抽象类定义时有两条规则:

  • 抽象方法必须要在子类实现
  • 抽象类是不能被实例化的

在这里插入图片描述

类的类型

类本身也是可以作为一种数据类型的,可以用作类型注解。

class Person {
  name: string = "alice";
  eating() {}
}
const person: Person = {
  name: "kiki",
  eating() {
    console.log("i am eating");
  },
};
function printPerson(person: Person) {
  console.log(person.name);
}
printPerson(new Person());
printPerson(person);
printPerson({ name: "Macsu", eating() {} });

只要符合类的格式,就可以使用类的类型

函数和类在JS和TS中都是至关重要的,可以帮助开发者更好规范开发时的代码,减少线上故障~

总结

以上就是关于typescript函数和类的内容,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!      

--结束END--

本文标题: TypeScript中的函数和类你了解吗

本文链接: https://lsjlt.com/news/142741.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • TypeScript中的函数和类你了解吗
    目录函数作为参数定义函数函数参数的类型可选类型参数默认值剩余参数this的默认推导函数重载类初始化继承多态成员修饰符总结函数 以下声明了一个函数类型,通过type来定义类型别名,vo...
    99+
    2024-04-02
  • C++中类的转换函数你了解吗
    只有接受一个参数(其他参数有默认值的也算)的构造函数才能作为转换构造函数。 在C++中,接受一个参数的构造函数为将类型与该参数相同的值转换为类提供了蓝图。因此,下面的构造函数用于将d...
    99+
    2024-04-02
  • TypeScript中的接口和泛型你了解吗
    目录接口对象类型索引类型函数类型继承交叉类型接口实现interface 和 type 的区别字面量赋值枚举类型泛型泛型函数泛型接口泛型类类型约束总结接口 使用 interface 关...
    99+
    2024-04-02
  • ASP和JavaScript:你真的了解函数和数组吗?
    函数和数组是编程中非常重要的概念,无论是ASP还是JavaScript都离不开它们。本文将详细讲解函数和数组的基本概念及其在ASP和JavaScript中的应用。 一、函数 函数是一段可重用的代码,可以接受输入参数并返回值。在编程中,函数...
    99+
    2023-11-13
    javascript 函数 数组
  • C语言的abs()函数和div()函数你了解吗
    C语言库中提供了许多函数,这样需要计算的时候,可以直接借助库函数,而不用自己重新编写函数。今天就来看一下C语言标准库函数里面的整型函数。 int __cdecl abs(int ...
    99+
    2024-04-02
  • python的函数参数你了解吗
    目录前言位置传参关键字传参默认参数不定长参数混合使用问题创建时引用时总结前言 python参数类型和参数传递形式多样,相对于其他语言python使用会更加灵活。它传参形式一般分为两种...
    99+
    2024-04-02
  • C++中的函数你真的理解了吗
    目录1 概述2 函数的定义及调用3 值传递4 函数的常见形式5 函数的声明6 函数的分文件编写作用:让代码结构更加清晰1.2.3.4.总结1 概述 作用:将一段经常使用的代码进行封装...
    99+
    2024-04-02
  • 你了解Java中的Object类吗
    任何一个类默认继承Object类,就算没有直接继承,最终也会间接继承。 Object类,有两种方式找到: 第一种:在源码当中找到 第二种:查阅java类库的帮助文档...
    99+
    2024-04-02
  • PHP编程中的数据类型:你了解了吗?
    在PHP编程中,数据类型是非常重要的一部分。正确使用数据类型可以提高程序的效率和可读性,避免不必要的错误和问题。本文将介绍PHP中常见的数据类型,并演示一些代码来帮助你更好地理解它们。 基本数据类型 PHP中的基本数据类型包括整型(i...
    99+
    2023-09-10
    编程算法 学习笔记 数据类型
  • 你了解ASP中的HTTP数据类型吗?
    ASP(Active Server Pages)是一种基于服务器端的脚本语言,它可以用来构建动态网站。在ASP中,HTTP数据类型是非常重要的一个概念。本文将为大家详细介绍ASP中的HTTP数据类型。 一、HTTP数据类型概述 HTTP(H...
    99+
    2023-08-11
    数据类型 http 自然语言处理
  • Java中的抽象类和接口你了解吗
    目录抽象类什么是抽象类?抽象类属于什么类型?抽象类怎么定义?抽象类是干什么的?什么是抽象方法?非抽象类继承抽象类抽象类总结接口接口的基础语法接口的实现接口和多态联合使用继承和实现同时...
    99+
    2024-04-02
  • C++的多态和虚函数你真的了解吗
    目录一、C++的面试常考点二、阿里真题2.1 真题一(1)虚函数表vtbl(2)构造一个派生类对象的过程(3)析构一个派生类对象的过程2.2 真题二2.3 真题三2.4 真题四2.5...
    99+
    2024-04-02
  • C++的内联函数你了解吗
    目录1.概念2.函数演示3.函数特性总结1.概念 以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销,内联函数提升程序运行的效率。...
    99+
    2024-04-02
  • Java中的内部类你了解吗
    目录成员内部类1.定义2.成员内部类的使用规则 3.成员内部类对象的创建:4.内部类与静态域静态内部类:1.定义:2.静态内部类的使用规则:3.静态内部类对象的创建&nbs...
    99+
    2024-04-02
  • 你了解Spring框架中的数据类型吗?
    Spring框架是一个非常流行的Java开发框架,它提供了很多便捷的功能,包括数据类型的处理。在这篇文章中,我们将介绍Spring框架中的数据类型,并提供一些示例代码。 基本数据类型 Spring框架中支持Java的基本数据类型,包括i...
    99+
    2023-08-19
    数据类型 spring windows
  • python的函数形参和返回值你了解吗
    目录函数的返回值函数的参数不可变参数和可变参数+=函数的参数缺省参数多值参数元组和字典的拆包总结函数的返回值 一个函数执行后可以返回多个返回值 def measure(): ...
    99+
    2024-04-02
  • Javascript的异步函数和Promise对象你了解吗
    目录1、JS中的异步1.1 同步1.2 异步1.3 回调函数解决异步问题1.4 回调地狱2、Promise对象2.1 Promise的基本使用2.2 async 和 await总结1...
    99+
    2024-04-02
  • JavaSE的类和对象你真的了解吗
    目录1.基本概念1.1面向对象1.2类和对象2.类的定义及使用2.1定义2.2类的实例化3.this引用3.1访问成员变量3.2访问成员方法3.3this引用的特性4.构造方法4.1...
    99+
    2024-04-02
  • C语言中的时间函数clock()和time()你都了解吗
    目录clock函数time函数总结时间函数在编写代码的时候会经常用到,下面就来总结一下clock和time函数的用法,函数原型如下: clock_t __cdecl clock(...
    99+
    2024-04-02
  • C++inline函数的特性你了解吗
    目录一.inline的作用(内联函数)二.inline的实现(注意debug模式下内联函数不会展开)三.使用inline的注意事项四.inline和预处理的区别总结一.inline的...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作