TypeScript浅析

155 阅读4分钟

TypeScript静态类型

Static Typing 简单理解一旦定义类型就无法改变,类型的属性和方法也确定了,ide有更好的语法提示

let countnumber = 1//count的静态类型就为number
// 自定义静态类型
interface XiaoJieJie {
  namestring;
  agenumber;
}
const xiaohongXiaoJieJie = {
  name"小红",
  age18,
};
console.log(xiaohong.age);

基础静态类型和对象静态类型

const countnumber = 888;
const myNamestring = "bbter";
// null,undefined,boolean,void,symbol
// 普通对象类型
const girl: { namestringagenumber } = {
  name"iu",
  age18,
};
// 数组类型
const girlsstring[] = ["iu""杨幂""小红"];
// 类类型
class Person {}
const bbterPerson = new Person();
// 函数类型
const meetGirl() => string = () => {
  return "iu";
};

类型注释和类型判断

// type.annotation 类型注解
// type inference 类型推断
let num: number;
num = 123;
let numinference = 123;
let one = 1;
let two = 2;
let tree = one + two;
function getTotal(one: number, two: number) {
  return one + two;
}
const total = getTotal(12);
const mm = {
  name: "iu",
  age: 18,
};

函数参数和返回类型的注解

// 函数参数和返回类型的注解
// function getTotal(one: number, two: number): number {
//   return one + two;
// }
// const total = getTotal(1, 2);
// function sayHello(): void {
//   console.log("hello world");
// }
function errorFunction(): never {
  throw new Error();
  console.log("hello world");
}
function forNerver(): never {
  while (true) {}
  console.log("hello world");
}
// 如果参数是对象
function add({ one, two }: { one: number; two: number }) {
  return one + two;
}
const total = add({ one1two2 });
function getNumber({ one }: { one: number }) {
  return one;
}

数组类型注解的方法

const numberArrnumber[] = [123];
const stringArrstring[] = ["a""b""c"];
const undefinedArrundefined[] = [undefinedundefined];
const arr: (string | number)[] = [1"string"];
//type alias 类型别名
type Lady = { namestringagenumber };
class Madom {
  namestring;
  agenumber;
}
const mmsMadom[] = [
  { name"iu"age18 },
  { name"小红"age18 },
];

元祖的使用和类型约束

元祖相当于数组的加强版,每一项确定

// const mms: (string | number)[] = ["小红""teacher"18];
// const mms: [stringstring, number] = ["小红""teacher"18];
const mms: [stringstring, number][] = [
  ["小红""teacher"18],
  ["小白""teacher"18],
  ["小黑""teacher"18],
];
//csv
// "小红""teacher"18;
// "小白""teacher"18;
// "小黑""teacher"18;

接口interface

interface Girl {
  namestring;
  agenumber;
  bustnumber;
  waistline?: number;
  [propnamestring]: any;
  say(): string;
}
// 接口继承
interface Teacher extends Girl {
  teach(): string;
}
class Mm implements Girl {
  name = "小玲";
  age = 18;
  bust = 95;
  say() {
    return "我是小玲";
  }
}
const girl = {
  name"小美",
  age20,
  bust92,
  waistline21,
  sex"女",
  say() {
    return "你好我是小美";
  },
  teach() {
    return "我来教你";
  },
};
const cv = (girl: Girl) => {
  girl.age < 24 && girl.bust >= 90 && console.log(girl.name + "进入面试");
  girl.age >= 24 || (girl.bust < 90 && console.log(girl.name + "你被淘汰"));
};
const getCv = (girl: Teacher) => {
  console.log(girl.name + "年龄是" + girl.age);
  console.log(girl.name + "胸围是" + girl.bust);
  girl.waistline && console.log(girl.name + "腰围是" + girl.waistline);
  girl.sex && console.log("性别" + girl.sex);
};
cv(girl);
getCv(girl);

类的概念和使用

class Lady {
  content = "Hi,帅哥~";
  sayHello() {
    return this.content;
  }
}
class titleGirl extends Lady {
  sayHello() {
    return super.sayHello() + ".你好!";
  }
  sayLove() {
    return "I love you";
  }
}
const goddess = new titleGirl();
console.log(goddess.sayHello());
console.log(goddess.sayLove());

类的访问类型

// private protected public
// 类的内部和类的外部
// public 类的内部和外部都可以调用
// private 私有的 允许这种类的内部使用,类的外部包括继承中都不可以使用
// protected 受保护的 继承关系中可以使用,类的外部不能使用
class Person {
  // private protected 只能在类的内部进行使用
  protected namestring;
  public sayHello() {
    console.log(this.name + " say hello");
  }
}
class Teacher extends Person {
  //protected 可以在继承里的类进行使用 private不行
  public sayBye() {
    this.name;
  }
}
const person = new Person();
// person.name = "bbter";
// person.sayHello();
// console.log(person.name);

类的构造函数

class Person {
  //   public name: string;
  //   constructor(name: string) {
  //     this.name = name;
  //   }
  constructor(public name: string) {}
}
class Teacher extends Person {
  constructor(public age: number) {
    super("bbter");
  }
}
const person = new Teacher(18);
console.log(person.age);
console.log(person.name);

类的Getter、Setter和static

class Girl {
  constructor(private _age: number) {}
  //get set可以对_age进行变化
  get age() {
    return this._age - 10;
  }
  set age(age: number) {
    this._age = age + 3;
  }
}
const girl1 = new Girl(28);
girl1.age = 25;
console.log(girl1.age);
// static 静态类
class Mm {
  static sayLove() {
    return "i love you";
  }
}
// 不需要有对象 直接类名.方法就可以进行调用
console.log(Mm.sayLove());

抽象类 只读属性和使用

class Person {
  public readonly _namestring;
  constructor(name: string) {
    this._name = name;
  }
}
const person = new Person("bbter");
// person._name = "xxx";
console.log(person._name);
// 抽象类
abstract class Girl {
  // 抽象方法
  abstract skill();
}
// 子类必须实现 抽象方法
class Waiter extends Girl {
  skill() {
    console.log("大爷喝好吃好");
  }
}
class BaseTeacher extends Girl {
  skill() {
    console.log("大爷来个泰式按摩吧");
  }
}
class SeniorTeacher extends Girl {
  skill() {
    console.log("大爷来个SPA全身按摩吧");
  }
}

联合类型和类型保护

interface Waiter {
  anjiaoboolean;
  say() => {};
}
interface Teacher {
  anjiaoboolean;
  skill() => {};
}
// 类型保护
function judgeWho(person: Waiter | Teacher) {
  if (person.anjiao) {
    (person as Teacher).skill();
  } else {
    (person as Waiter).say();
  }
}
function judgeWhoTwo(person: Waiter | Teacher) {
  if ("skill" in person) {
    person.skill();
  } else {
    person.say();
  }
}
function add(first: string | number, second: string | number) {
  if (typeof first === "string" || typeof second === "string") {
    return `${first}${second}`;
  }
  return first + second;
}
class NumberObj {
  countnumber;
}
function addObj(first: object | NumberObj, second: object | NumberObj) {
  if (first instanceof NumberObj && second instanceof NumberObj) {
    return first.count + second.count;
  }
  return 0;
}

枚举类型

enum Status {
  ANMO = 1,
  SPA,
  DABAOJIAN,
}
function getServe(status: any) {
  if (status === Status.ANMO) {
    return "按摩";
  } else if (status === Status.SPA) {
    return "SPA";
  } else if (status === Status.DABAOJIAN) {
    return "大保健";
  }
}
console.log(Status.ANMO);
console.log(Status.SPA);
console.log(Status.DABAOJIAN);
console.log(Status.ANMO, Status[1]);
const result = getServe(2);
console.log(`我要去${result}`);

函数中使用泛型

  • 泛型是指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性,相当于类型系统的参数,用于类型复用
//泛型
// 多个泛型的定义
function join<TP>(first: T, second: P) {
  return `${first}${second}`;
}
join<string, number>("1"2);
// 泛型中数组的使用
function myFun<T>(params: Array<T>) {
  return params;
}
myFun<string>(["a""b""c"]);

类中使用泛型

class SelectGirl<T extends number | string> {
  constructor(private girls: T[]) {}
  getGirl(indexnumber): T {
    return this.girls[index];
  }
}
const selectGirl = new SelectGirl<string>(["小红""小青""小美"]);
console.log(selectGirl.getGirl(1));