TypeScript类型断言

什么是类型断言

类型断言可以用来手动指定一个值的类型,即允许变量从一种类型更改为另一种类型。

语法格式

格式一:<类型>值
格式二:值 as 类型

类型断言的特点

1.联合类型可以被断言为其中一个类型
2.父类可以被断言为子类
3.任何类型都可以被断言为any
4.any可以被断言为任何类型

变量断言为指定类型

let str = '世界上最遥远的距离不是生与死,你是if而我是else,似乎一直相伴但又永远相离。'

//方式一
// <string>就是我们断言的类型,如果是<number>就会报错,两种类型不能转换,number没有length属性
let len = (<string>str).length
console.log(len)

// 方式二 as 作为
// string就是我们断言的类型,如果是number,boolean就会报错,两种类型不能转换,number没有length属性
let len = (str as string).length
console.log(len)

普通函数联合类型可以被断言为其中一个类型

//函数错误例子
function TypeAs(x: string | number){
  console.log(x.length)
}
TypeAs('世界上最痴心的等待,是我当case而你当switch,或许永远都选不上自己。')

//函数类型断言
function TypeAs(x: string | number){
  //方式一
  let len = (<string>x).length
  console.log(len)

  //方式二
   let len = (x as string).length
  console.log(len)
}
TypeAs('世界上最痴心的等待,是我当case而你当switch,或许永远都选不上自己。')

父类可以被断言为子类

class Father {
    name: string
    constructor(name:string) {
        this.name = name
    }
    say(str:string): void {
        console.log(this.name + "说" + str);
    }
}
class Son  extends Person{
    like: string
    constructor(name:string, age: number, like:string) {
       super(name,age)
       this.like = like
    }
    eat(){}
}
function isSon(user:Father){
    if(typeof(user as Son).name === 'string'){
        return true
    }
    return false
}

接口联合类型断言为其中一个类型

interface Cat {
    name:string;
    run():void;
}
interface Fish {
    name:string;
    swim():void;
}
function getName(animal:Cat|Fish):string{
    return animal.name;
}

只能访问联合属性中共有的属性和方法——name。
如果在不确定类型的时候就想访问一个类型确定的属性和方法,就需要【断言】

function isFish(animal:Cat|Fish):boolean{
    return (typeof (animal as Fish).swim) === "function";
}

将变量animal断言为Fish类型,那么访问其swim属性,就可以通过编译器的检查。
类型断言相当于欺骗编译器,编译的时候不报错,不代表运行的时候不报错。

const tom:Cat = {
    name:"cat",
    run(){
        console.log("running");
    }
}
function swim(animal:Cat|Fish){
    (animal as Fish).swim();
}
swim(tom);

编译结果

var tom = {
    name: "cat",
    run: function () {
        console.log("running");
    }
};
function swim(animal) {
    animal.swim();
}
swim(tom);
//TypeError: animal.swim is not a function

 上一篇
TypeScript中Interface与Type TypeScript中Interface与Type
Interface Interface可以使用extends和implements。它在声明的那一刻并不是最终类型,由于interface可以进行声明合并,在创建后是可变的,可以将新成员添加到同一个interface中。 Type 可以声明
2021-10-24
下一篇 
TypeScript接口Interface TypeScript接口Interface
在编程中,接口是一种规范的定义。接口跟抽象类有点像,但是,接口中不能有方法体,只允许有方法定义。 属性类型接口 //对传入对象的属性约束,以下这个是一个属性接口 interface User { name: string;
2021-10-23
  目录