TypeSctipt学习第二篇

在这里插入图片描述

TypeSctipt学习第二篇

 这里是读阮一峰老师的TS文章笔记记录

链接: link

TypeScript主要是类型约束与TS静态自检测。就是写代码的时候就给你排除存在的错误了。
所以Ts就行去设计一些规范按照这些规范来减少错误发生。
JavaSctipt没有的强类型与潜在的问题监测TS加进去了。

1.变量声明

let x:string;变量x的后面使用冒号,声明了它的类型为string

2.联合类型

let x:string|number;这个变量可以是string或者number.

3.联合类型 可以 直接用值来设置,类似枚举

let setting: true | false;//值可以是true或false
let gender: "male" | "female";
let Color: "赤" | "橙" | "黄" | "绿" | "青" | "蓝" | "紫";值可以是其中一个
    Color="橙";

4.函数参数,返回值规定类型

function toString(num: number,id: number | string): string {这里规定了参数,返回值类型
  return String(num);
}
//函数类型限制
function distanceFromOrigin([x, y]: [number, number]) {}

5.判断参数scheme的类型是http还是https

function getPort(scheme: "http" | "https") {http,https 这是类型
  switch (scheme) {
    case "http":
      return 80;
    case "https":
      return 443;
  }
}

6.交叉类型,同时满足几种类型

let x: number & string;

7.type命令用来定义一个类型的别名。

定义一个类型,用于限制变量的值必须是我定义的类型。
type关键字会给你的类型取一个名字 你后面用它去限制变量就行。

type abc = number;
let age: abc = 55;
type leix1=number | string 联合离线 or
type leix2='男' | '女'     类似枚举

type Area={width:number,heigth:number} 定义一个类型
let a:Area;这个a就是Area类型的
type Address={guojia:string,shenfen:string} 定义一个类型
type houser=Area & Address; 交叉类型
let b:houser={...} 需要同时有以上两个类型

8.判断x的类型

if (typeof x === "string") {...}

9.数组声明

let a:number[]=[1,2,3];一个类
let arr: (number | string)[]=[1,'b',2];数组内多个类型
let arr: Array<number> = [1, 2, 3];泛型,就是可以是自定义的类型
let arr: Array<number | string>[1, 2, 3,'aaa'];;泛型  可以是多种类型
    arr.length = 2;这样可以将只保留前面两个元素在里面,删除其他元素

10.只读数组,不能再去修改它

const arr: readonly number[] = [0, 1];
const arr = [0, 1] as const;
实际上,TypeScript 提供了两个专门的泛型,用来生成只读数组的类型。
const a1: ReadonlyArray<number> = [0, 1];
const a2: Readonly<number[]> = [0, 1];

11.多维数组

TypeScript 使用T[][]的形式,表示二维数组,T是最底层数组成员的类型。

var multi: number[][] = [[1, 2, 3],[23, 24, 25]];

12.元组(tuple)是 Ts 特有的数据类型,

	类型可以自由设置的数组,即数组的各个成员的类型可以不同。
	const s: [string, string, boolean] = ["a", "b", true];
	let a: [number, number?] = [1]; 第二个成员是可选的,可以省略
	元组个数也是严格根据类型个数
	let x: [string, string] = ["a", "b"];
	x[2] = "c";  报错
	但是,使用扩展运算符(...),可以表示不限成员数量的元组
	type NamedNums = [string, ...number[]];//[string, ...boolean[], number];
	const b: NamedNums = ["B", 1, 2, 3];

13.只读元组

// 写法一
type t = readonly [number, string];
// 写法二
type t = Readonly<[number, string]>;

14.数组与元组的区别:数组类型写[]外面

数组:number[],
元组:[number]

15.三种特殊类型

any //类型表示没有任何限制
unknown //赋值给any和unknown以外类型的变量都会报错
never//什么类型都不是

16.undefined和null既是值,又是类型。

let a:undefined=undefined;

17类 和 类的继承

父类
class person{
  name:string,
  age:number
  constructor(name:string,age:number){构造函数
  this.name=name
  this.age=age
  }
  speak(){
	  console.log(`我叫${this.name},今年${this.age}岁!`)
  }
}
子类,继承
class Student extends person{
  banji:string
  constructor(name:string,age:number,banji:string){
   super(name,age)
   this.banji=banji
  }
   study(){
	  console.log(`我叫${this.name},今年${this.age}岁,我在${this.banji}`)
  }
  Override speak(){...}重写父类方法
}

构造函数简写,修饰符不能丢

class person{
  constructor(public name:string, public age:number){}//不用声明不用this.name=name
  }

类的四种修饰符 ,去修饰属性或方法 访问限制
public‌:默认修饰符,表示公共的,任何位置都可以访问该成员。没有明确指定修饰符时,默认即为public。
‌private‌:表示私有的,只有自身内部可以访问,外部、子类中都无法访问该成员数据。
‌protected‌:表示受保护的,自身内部和子类中可以访问,外部无法访问。
‌readonly‌:表示只读,仅可在构造函数中修改。

class person{
  constructor(private name:string, public age:number){}//不用声明不用this.name=name
  }

抽象类 abstract

不能被实例化,存在的意义就是被继承,有抽象方法,有具体实现方法。

  abstract class car{
      constructor(public pinpai:string){}构造函数
      abstract info():string 抽象方法
      showinfo():void{具体方法
        console.log(${this.pinpai})
      }
   }
 下面继承 实现它
 class toyota extends car{
  constructor(pinpai:string, public color:string){super(pinpai)}子类构造函数
  info():string{ return this.color;}实现抽象方法
}

接口 interface

去约束别的 类,对象 ,函数 的实现方式。

 定义一个接口,继承它的必须有这些属性方法
 interface Iperson{
    name:string,
    age:number
    speak(n:number):void
 }
 定义一个  类   去实现 接口
 Class zhangsan implements Iperson{...里面正常写只要有接口的属性 和方法就行}
 实现多个用逗号隔开
 定义一个接口,继承它的必须有这些属性方法
 interface Iperson{
    name:string,
    readonly sex:number,只读
    age?:number 可选
    speak(n:number)=>void
 }
 定义一个  对象  去实现 接口
 const lisi:Iperson={...里面正常写只要有接口的属性 和方法就行}
 定义一个接口,用来约束函数
 interface IF1{
    (a:number,b:number):number; 参数返回值必须跟这一样
 }
 一个  函数  去实现 接口
 const fun1:IF1=(a,b)=>{
  return a+b;
 }
接口之间的继承 I1 extends I2{...}
使用就是都要满足

泛型

参数类型设计时不知道,调用时候才给类型。

泛型函数

 定义泛型函数,这里不知道参数的类型是什么
 function logshow<T>(data:T){
  console.log(data);
}
logshow<string>("php");现在告诉他传一个字符串
 定义泛型函数,多个参数
 这个方法说我有两个参数,类型都不知道,返回值类型是其中的一个类型
 function logshow<T,A>(data1:T,data2:A):T|A{
  return Date.now()%2?data1:data2;
}
logshow<string,number>("php",20);现在告诉他传一个字符串

泛型接口

 定义一个接口,接口里面需要一个类型,什么类型不知道现在
 interface Iperson<T>{
    name:string,
    readonly sex:number,只读
    age?:number 可选
    info:T
    speak(n:number)=>void
 }
 定义一个对象去实现 接口,现在才给它类型,可以是自定义类型。
 const lisi:Iperson<number>={..    info:100}

泛型类

 定义泛型类
 class person<T>{
  constructor(name:string,age:number,info:T)
  show():string{
    return this.name
  }
}
const obj=new person<string>("php",20,"hello");实例化类的时候告诉它是个string

装饰器

通过方法 类上面加特性 让类有一些其他的功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值