typescript

50 阅读1分钟

2.3 联合类型和类型保护

interface Waiter {
  anjiao: boolean;
  say: () => {};
}

interface Teacher {
  anjiao: boolean;
  skill: () => {};
}

function judgeWho(animal: Waiter | Teacher) {}

这时候问题来了,如果我直接写一个这样的方法,就会报错,因为judgeWho不能准确的判断联合类型具体的实例是什么。 这时候就需要再引出一个概念叫做类型保护

类型保护-in 语法

function judgeWhoTwo(animal: Waiter | Teacher) {
  if ("skill" in animal) {
    animal.skill();
  } else {
    animal.say();
  }
}

类型保护-typeof 语法

function sum(a:number|string, b:number|string){
    if(typeof a === 'string' && typeof b ==='string'){
        return a + b
    }
    
}

2.4Enum 枚举类型

enum Status {
  MASSAGE = 1,
  SPA,
  DABAOJIAN,
}

默认从0开始递增,可以自己设置

2.5 TypeScript 函数泛型-难点

泛型的定义使用<>(尖角号)进行定义的

function sum<T>(a:T, b:T){
    return `${a},${b}`
}
console.log(sum<number>(1, 2))

泛型中数组的使用

function myFun<ANY>(params: ANY[]) {
    return params;
  }
  myFun(["123", "456"])

多个泛型的定义

function join<T, P>(first: T, second: P) {
  return `${first}${second}`;
}
join(1, "2")

初始类的泛型

class seletdog<t>{
    constructor(private dog:t[]){}
    getdog(index:number){
        return this.dog[index]
    }
}

const seletdog1 = new seletdog(['1', '2', '3'])
console.log(seletdog1.getdog(2))

泛型约束

class SelectGirl<T extends number | string> {
  //.....
}

泛型中的继承


interface dogname{
    name:string
}

class seletdog<t extends dogname>{
    constructor(private dog:t[]){}
    getdog(index:number){
        return this.dog[index].name
    }
}

const seletdog1 = new seletdog([{name:'1'}, {name:'2'}, {name:'3'}])
console.log(seletdog1.getdog(2))

有一个约束条件,这个类型,必须要有一个name属性