什么是类型断言
类型断言可以用来手动指定一个值的类型,即允许变量从一种类型更改为另一种类型。
语法格式
格式一:<类型>值
格式二:值 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