TypeScript【枚举、联合类型函数_基础、函数_参数说明 、类的概念、类的创建】(二)-全面详解(学习总结---从入门到深化)

简介: TypeScript【枚举、联合类型函数_基础、函数_参数说明 、类的概念、类的创建】(二)-全面详解(学习总结---从入门到深化)

枚举



枚举(Enum)类型用于取值被限定在一定范围内的场景,比如一周只能有七天,颜色限定为红绿蓝等


枚举例子


枚举使用 enum关键字来定义

enum Days {Sun, Mon, Tue, Wed, Thu, Fri, Sat} 


枚举成员会被赋值为从 0 开始递增的数字,同时也会对枚举值到枚举名进行反向映射

enum Days {Sun, Mon, Tue, Wed, Thu, Fri,Sat};
console.log(Days["Sun"] === 0); // true
console.log(Days["Mon"] === 1); // true
console.log(Days["Tue"] === 2); // true
console.log(Days["Sat"] === 6); // true
console.log(Days[0] === "Sun"); // true
console.log(Days[1] === "Mon"); // true
console.log(Days[2] === "Tue"); // true
console.log(Days[6] === "Sat"); // true


手动赋值

enum Days {Sun = 7, Mon = 1, Tue, Wed, Thu, Fri, Sat};
console.log(Days["Sun"]); // 7
console.log(Days[1]); // Mon


枚举类型提供的一个便利是你可以由枚举的值得到它的名字

enum Color { Red = 1, Green, Blue }
let colorName: string = Color[2];
console.log(colorName); // Green


联合类型



联合类型(Union Types)表示取值可以为多种类型中的一种


当我们需要定义的数据并不确定是那种类型的时候,可以使用联合类型

var age:number | string = 20;
age = "20岁"
console.log(age)


甚至可以是更多种类型的联合

var age:number | string | boolean | [] = 20;
age = "20岁"
console.log(age)


函数中的联合类型


联合类型其实最常用的场景就是在函数中

function
info(age:number|string):number|string{
  return age;
}
info(20)
info("20")


函数_基础



函数是 JavaScript 应用程序的基础。在 TypeScript 里函数仍然是主要的定义行为的地方


常见函数定义形式

function add(x, y) {
  return x + y;
}
let add = function(x, y) {
  return x + y;
};


TypeScript定义函数


让我们为上面那个函数添加类型

function add(x:number, y:number):number {
  return x + y;
}


我们可以给每个参数添加类型之后再为函数本身添加返回值类型。TypeScript 能够根据返回语句自动推断出返回值类型,因此我们通常省略它


注意,输入多余的(或者少于要求的)参数,是不被允许的

function add(x:number, y:number):number {
  return x + y;
}
add(10,20,30) // 编译报错


箭头函数

const add = (x:number, y:number) =>{
  return x + y
}


温馨提示

返回值一般会自行推断


函数_参数说明



函数的参数在ES6中就有很大的改动了,在TypeScript中也依然适用


可选参数


前面提到,输入多余的(或者少于要求的)参数,是不允许的。那么如何定义可选的参数呢?


我们用 ? 表示可选的参数

const add = (x:number, y:number,z?:number) =>
{
  return x + y
}
add(10,20)
add(10,20,30)


温馨提示

可选参数必须接在必需参数后面,可选参数后面不允许再出现必需参数了


参数默认值


在 ES6 中,我们允许给函数的参数添加默认值,TypeScript 会将添加了默认值的参数识别为可选参数

function info(name: string, age: number = 20)
{
  return name + age
}
info("iwen")
info("iwen",30)


此时就不受「可选参数必须接在必需参数后面」的限制了


剩余参数


ES6 中,可以使用 ...rest 的方式获取函数中的剩余参数(rest 参数)

function push(array:any[], ...items:any[]) {
  items.forEach(function(item) {
    array.push(item);
 });
  return array
}
let a: any[] = [];
const currentArray = push(a, 1, 2, 3);


注意,rest 参数只能是最后一个参数


重载


重载允许一个函数接受不同数量或类型的参数时,作出不同的处理

function reverse(x: number | string): number | string | void {
  if (typeof x === 'number') {
    return Number(x.toString().split('').reverse().join(''));
 } else if (typeof x === 'string') {
    return x.split('').reverse().join('');
 }
}


然而这样有一个缺点,就是不能够精确的表达,输入为数字的时候,输出也应该为数字,输入为字符串的时候,输出也应该为字符串

function reverse(x:number):number;
function reverse(x:string):string;
function reverse(x:number|string): number | string |void{
  if (typeof x === 'number') {
    return Number(x.toString().split('').reverse().join(''));
 } else if (typeof x === 'string') {
    return x.split('').reverse().join('');
 }
}
const numReverse = reverse(123);
const stringReverse = reverse("Hello");


类的概念



虽然 JavaScript 中有类的概念,但是可能大多数 JavaScript 程序员并不是非常熟悉类,这里对类相关的概念做一个简单的介绍


类(Class):定义了一件事物的抽象特点,包含它的属性和方法


对象(Object):类的实例,通过 new 生成


面向对象(OOP)的三大特性:封装、继承、多态


封装(Encapsulation):将对数据的操作细节隐藏起来,只暴露对外的接口。外界调用端不需要(也不可能)知道细节,就能通过对外提供的接口来访问该对象,同时也保证了外界无法任意更改对象内部的数据


继承(Inheritance):子类继承父类,子类除了拥有父类的所有特性外,还有一些更具体的特性


多态(Polymorphism):由继承而产生了相关的不同的类,对同一个方法可以有不同的响应。比如 Cat 和 Dog 都继承自 Animal ,但是分别实现了自己的 eat 方法。此时针对某一个实例,我们无需了解它是 Cat 还是 Dog ,就可以直接调用 eat 方法,程序会自动判断出来应该如何执行 eat


存取器(getter & setter):用以改变属性的读取和赋值行为


修饰符(Modifiers):修饰符是一些关键字,用于限定成员或类型的性质。比如 public 表示公有属性或方法


抽象类(Abstract Class):抽象类是供其他类继承的基类,抽象类不允许被实例化。抽象类中的抽象方法必须在子类中被实现


接口(Interfaces):不同类之间公有的属性或方法,可以抽象成一个接口。接口可以被类实现(implements)。一个类只能继承自另一个类,但是可以实现多个接口

class Animal { 
  public name;
  constructor(name) {
    this.name = name;
 }
  sayHi() {
    return `My name is ${this.name}`;
 }
  get _name() {
    return 'Jack';
 }
  set _name(value) {
    console.log('setter: ' + value);
 }
}
let a = new Animal('Jack');
class Cat extends Animal {
 constructor(name) {
  super(name); // 调用父类的constructor(name)
  console.log(this.name);
}
 sayHi() {
  return 'Meow, ' + super.sayHi(); // 调用父类的 sayHi()
}
}
let c = new Cat('Tom'); // Tom
console.log(c.sayHi()); // Meow, My name is Tom


类的创建



传统的 JavaScript 程序使用函数和基于原型的继承来创建可重用的组件,但对于熟悉使用面向对象方式的程序员来讲就有些棘手,因为他们用的是基于类的继承并且对象是由类构建出来的。 从

ECMAScript 2015,也就是 ECMAScript 6 开始,JavaScript 程序员将能够使用基于类的面向对象的方式。 使用 TypeScript,我们允许开发者现在就使用这些特性,并且编译后的 JavaScript 可以在所有主流浏览器和平台上运行  


ES5类


基于原型的类创建

function People(name,age) { 
  // 属性
  this.name = name;
  this.age = age;
  // 方法;
  this.sayHello = function(){
    console.log("Hello");
 }
}
People.prototype.sayHi = function(){
  console.log("hi")
}
var p1 = new People("张三",20);


ES6类


基于 class 传统创建方式

class Animal {
  public name;
  constructor(name) {
    this.name = name;
 }
  sayHi() {
    return `My name is ${this.name}`;
 }
}
let a = new Animal('Jack');
console.log(a.sayHi());


TypeScript类

class Greeter {
  greeting: string;
  constructor(message: string) {
    this.greeting = message;
 }
  greet() {
    return "Hello, " + this.greeting;
 }
}
let greeter = new Greeter("world");
目录
相关文章
|
8天前
|
JavaScript
typeScript进阶(9)_type类型别名
本文介绍了TypeScript中类型别名的概念和用法。类型别名使用`type`关键字定义,可以为现有类型起一个新的名字,使代码更加清晰易懂。文章通过具体示例展示了如何定义类型别名以及如何在函数中使用类型别名。
25 1
typeScript进阶(9)_type类型别名
|
9天前
|
JavaScript
typeScript基础(2)_any任意值类型和类型推论
本文介绍了TypeScript中的`any`任意值类型,它可以赋值为其他任何类型。同时,文章还解释了TypeScript中的类型推论机制,即在没有明确指定类型时,TypeScript如何根据变量的初始赋值来推断其类型。如果变量初始化时未指定类型,将被推断为`any`类型,从而允许赋予任何类型的值。
25 4
|
8天前
|
JavaScript
typeScript基础(3)_ts函数默认值和可选参数
本文介绍了在TypeScript中如何使用函数的默认值和可选参数。展示了如何为函数参数指定默认值,使得在调用函数时可以省略某些参数,以及如何定义可选参数。
28 2
|
8天前
|
JavaScript
typeScript基础(5)_对象的类型-interfaces接口
本文介绍了TypeScript中接口(interfaces)的基本概念和用法,包括如何定义接口、接口的简单使用、自定义属性、以及如何使用`readonly`关键字定义只读属性。接口在TypeScript中是定义对象形状的重要方式,可以规定对象的必有属性、可选属性、自定义属性和只读属性。
23 1
|
8天前
|
存储 JavaScript
typeScript进阶(11)_元组类型
本文介绍了TypeScript中的元组(Tuple)类型,它是一种特殊的数组类型,可以存储不同类型的元素。文章通过示例展示了如何声明元组类型以及如何给元组赋值。元组类型在定义时需要指定数组中每一项的类型,且在赋值时必须满足这些类型约束。此外,还探讨了如何给元组类型添加额外的元素,这些元素必须符合元组类型中定义的类型联合。
20 0
|
8天前
|
JavaScript
typeScript进阶(10)_字符串字面量类型
本文介绍了TypeScript中的字符串字面量类型,这种类型用来限制变量只能是某些特定的字符串字面量。通过使用`type`关键字声明,可以确保变量的值限定在预定义的字符串字面量集合中。文章通过示例代码展示了如何声明和使用字符串字面量类型,并说明了它在函数默认参数中的应用。
21 0
|
8天前
|
JavaScript
typeScript基础(4)_联合类型
本文介绍了TypeScript中的联合类型(Union Types),它表示变量可以是多种类型中的一种。文章通过示例展示了如何声明联合类型以及在使用联合类型时访问它们共有的属性和方法。同时,还解释了类型推论在联合类型变量赋值时的工作原理。
20 0
|
9天前
|
JavaScript
typeScript基础(1)_原始数据类型学习
本文介绍了TypeScript中的原始数据类型,包括布尔型、数值型、字符串型、`void`、`null`和`undefined`,并展示了如何在TypeScript中声明和使用这些类型。同时,还介绍了如何通过`tsc`命令编译TypeScript文件。
32 4
|
8天前
|
JavaScript 前端开发
typeScript基础(8)_ts类型断言
本文介绍了TypeScript中的类型断言,它用于在编译时告诉TypeScript某个对象具有特定的类型,即使它看起来不具备。类型断言可以用来访问一个类型上存在而另一个类型上不存在的属性或方法。需要注意的是,类型断言并不会在运行时改变JavaScript的行为,因此如果断言不当,运行时仍然可能出错。文章还提醒避免将类型断言为`any`类型或进行多重断言。
12 1
|
8天前
|
JavaScript
typeScript基础(6)_数组类型
本文介绍了TypeScript中数组的类型表示方法,包括直接使用类型加`[]`定义数组类型,以及使用数组泛型`Array<类型>`定义数组。同时,还展示了如何定义包含多种数据类型的数组。
20 1
下一篇
无影云桌面