类型别名和类型断言
类型别名(type aliases)
类型别名用来给一个类型起个新名字,常用于联合类型,与接口interface很相似,
使用 type 关键字创建类型别名
type Name = string; //返回一个string
type NameResolver = () => string; //接收一个函数 并返回string
type NameOrResolver = Name | NameResolver; //定义联合类型
// 在不清楚一个函数的参数是否是什么类型的话
function getName(n: NameOrResolver): Name {
if (typeof n === 'string') {
return n;
} else {
return n();
}
}
缺点:一次只能定义一个变量,若定义多个变量的话,最好的办法用interface
类型断言 type assertion
类型断言可以用来手动指定一个值的类型。
类型断言好比其它语言里的类型转换,但是不进行特殊的数据检查和解构。 它没有运行时的影响,只是在编译阶段起作用。 滥用类型断言可能会导致运行时错误:
类型断言有两种形式。 其一是“尖括号”语法:
let someValue: any = "this is a string";
//把any类型断言成string
let strLength: number = (<string>someValue).length;
另一个为as语法:但当你在TypeScript里使用JSX时,只有 as语法断言是被允许的
let someValue: any = "this is a string";
let strLength: number = (someValue as string).length;
在 ts 中除了表示类型断言之外,也可能是表示一个泛型。
故建议大家在使用类型断言时,统一使用 值 as 类型
这样的语法,在我们确实需要在还不确定类型的时候就访问其中一个类型特有的属性或方法,比如:
interface Cat {
name: string;
run(): void;
}
interface Fish {
name: string;
swim(): void;
}
function isFish(animal: Cat | Fish) {
if (typeof animal.swim === 'function') {
return true;
}
return false;
}
// index.ts:11:23 - error TS2339: Property 'swim' does not exist on type 'Cat | Fish'.
// Property 'swim' does not exist on type 'Cat'.
上面的例子中,获取 animal.swim
的时候会报错。
此时可以使用类型断言,将 animal
断言成 Fish
:
interface Cat {
name: string;
run(): void;
}
interface Fish {
name: string;
swim(): void;
}
function isFish(animal: Cat | Fish) {
if (typeof (animal as Fish).swim === 'function') {
return true;
}
return false;
}
这样就可以解决访问 animal.swim 时报错的问题了。
上面的例子编译时不会报错,但在运行时会报错,原因是 (animal as Fish).swim()
这段代码隐藏了 animal
可能为 Cat
的情况,将 animal
直接断言为 Fish
了,而 TypeScript 编译器信任了我们的断言,故在调用 swim()
时没有编译错误。
可是 swim
函数接受的参数是 Cat | Fish
,一旦传入的参数是 Cat
类型的变量,由于 Cat
上没有 swim
方法,就会导致运行时错误了。
总之,使用类型断言时一定要格外小心,尽量避免断言后调用方法或引用深层属性,以减少不必要的运行时错误。
其中类型断言在类中也有广泛的应用,大家如果有兴趣的话,可以自行去查阅这一部分的内容,本文暂不做详细介绍。
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!