TypeScript能够在特定的区块中保证变量属于某种确定的类型。可以在此区块中放心的引用此类型的属性,或调用此类型的方法。
下面的例子中,因为我们不知道程序运行的时候到底会传入什么样的参数,所以必须在每一处加上类型断言,这显然不是一个理想的方案,代码可读性差,而类型保护就是用来解决这个问题的,它可以提前对类型进行怕判断
enum Type {Strong,Week}
class Java{
helloJava(){
console.log("hello Java")
}
}
class JavaScript{
helloJavaScript(){
console.log("hello JavaScript")
}
}
function getLanguage(type:Type){
let lang = type === Type.Strong? new Java() : new JavaScript();
if( !!(lang as Java).helloJava ){
(lang as Java).helloJava()
}else{
(lang as JavaScript).helloJavaScript()
}
}
getLanguage(Type.Strong)
4种创建这种特殊区块的方法
1).instanceof 判断实例是不是属于某个类
2).in关键字 判断一个属性是不是属于某个对象
3).typeof 判断实例是不是属于某个类
4).创建类型保护函数 (某些判断可能不是一条语句能够搞定的,需要更多复杂的逻辑,适合封装到一个函数内) isJava方法的返回值类型叫做类型谓词
function isJava(lang:Java|JavaScript):lang is Java{
return (lang as Java).helloJava !== undefined;
}
function getLanguage( type:Type , x:string|number ){
let lang = type === Type.Strong? new Java() : new JavaScript();
//---------instanceof
if(lang instanceof Java){
lang.helloJava()
}else{
lang.helloJavaScript
}
//---------in
if("java" in lang){
lang.helloJava()
}else{
lang.helloJavaScript()
}
//typeof
if( typeof(x) === "string" ){
x.length //在这个区块中x就一定是string类型,它可以拥有string的属性和方法
}else{
x.toFixed()//在这个区块中x就一定是number类型,它可以拥有number的方法
}
// .创建类型保护函数
if( isJava(lang) ){
lang.helloJava()
}else{
lang.helloJavaScript()
}
}
getLanguage(Type.Strong,3)