TS学习笔记(Three Day)

829 阅读4分钟

Ts学习(联合类型,交叉类型,TS函数)

联合类型和类型别名

  • 联合类型:可以用来约束只取某些类型或者某些值中的一个。
const sayHello = (name: stringnumber)=>{
  if (typeof  name === 'number') {
    return 10 + name
  }
}
sayHello("semlinker");
sayHello(123);
sayHello(true);

小结:这里定义的是sayHellow的参数只能为字符串和数字类型,里面判断属性,是数字用来累加,当传入其他类型,会报错,说该类型不能赋值给那个对象。

  • 可辨识联合:
enum CarTransmission {
  Automatic = 200,
  Manual = 300
}
interface Motorcycle {
  vType"motorcycle"// discriminant
  makenumber// year
}
interface Car {
  vType"car"// discriminant
  transmissionCarTransmission
}
interface Truck {
  vType"truck"// discriminant
  capacitynumber// in tons
}
type Vehicle = Motorcycle | Car | Truck;
const EVALUATION_FACTOR = Math.PIfunction evaluatePrice(vehicle: Vehicle) {
  switch(vehicle.vType) {
    case "car":
      return vehicle.transmission * EVALUATION_FACTOR;
    case "truck":
      return vehicle.capacity * EVALUATION_FACTOR;
    case "motorcycle":
      return vehicle.make * EVALUATION_FACTOR;
  }
}
const myTruckTruck = { vType"truck"capacity9.5 };
evaluatePrice(myTruck);

小结:首先明白什么是可辨识, 联合类型中的每个元素都含有一个单例类型属性 ,例如上例中的truck,car,motorcycle,然后当使用时候,通过switch判断是哪个类型,然后做出相应操作。

  • 类型别名:用type方法,把一个类别定义成一个变量。
type bieMing = number|string
let hello = (message:bieMing) =>{
return  message
}

交叉类型

含义:交叉类型就像数学中的并级,通过&运算符创建一个新的point类型,表示一个含有x和y坐标的点,然后定义一个point类型的变量并且初始化。

  • 同名基础类型属性的合并:当合并时候,有两个类型中相同的属性名字,类型不同,合并以后类型会变成never。
interface X {
  a: string;
  b: string;
}

interface Y {
 a: number
  c: string
}

type XY = X & Y;
type YX = Y & X;

let intersection: XY;
let intersections: YX;
intersection = { c: 6, d: "d", e: "e" }
intersections = { c: '6', d: "d", e: "e" }

小结:这段代码放进编辑器,c会报错,intersection会说,不要将数字赋值给never,intersections会说,不要将string赋值给never,c原本类型是x中string,y中number,合并后变成never。

  • 同名非基础类型属性的合并
interface D { d: object; }
interface E { e: string; }
interface F { f: number; }

interface A { x: D; }
interface B { x: E; }
interface C { x: F; }

type ABC = A & B & C;

let abc: ABC = {
  x: {
    d: {1:true},
    e: 'coolFish',
    f: 666
  }
};

console.log('abc:', abc);

小结:非基础类型合并时候,存在多个相同成员,但是成员类型为非基础数据类型,那么可以成功合并。

Ts函数

  • Ts函数和Js函数的区别:ts有类型,有函数类型,参数可选,函数重载。

  • 参数类型和返回类型。

function createUserId(name: string, id: number): string {
  return name + id;
}
  • 可选参数和默认参数。
function createUserId(
  name: string = "semlinker",
  id: number,
  age?: number
): string {
  return name + id;
}

小结:这里的可选参数是age?:number, "semlinker"是name的默认参数 ,声明函数时,可以通过 ? 号来定义可选参数,比如 age?: number 这种形式。在实际使用时,需要注意的是可选参数要放在普通参数的后面,不然会导致编译错误

  • 函数重载:就是相同的函数名,不同的参数数量或者类型,通过判断参数,选择不同的执行程序。
class Calculator {
  add(anumberbnumber): number;
  add(astringbstring): string;
  add(astringbnumber): string;
  add(anumberbstring): string;
  add(a: any, b: any) {
  if (typeof a === 'number' && typeof b === 'number') {
    return a.toString() + b.toString();
  }
    return a + b;
  }
}

const calculator = new Calculator();
const result = calculator.add(123123);
console.log(result)

小结:这里最后传了两个number类型,所以最后进入if内,返回的123123,