类型保护是为了更加精确的知道类型
typeof保护
可以使用typeof用来确定类型,那么参数就可以使用确定类型的方法
function a(a:number | string | boolean):number{
if (typeof a == "string"){
//a.length
//可以使用字符的方法
}else if (typeof a == "number"){
// 可以使用number的方法
}else{
//可以使用布尔值
}
return 1
}
}
instanceof 方法
可以使用instanceof用来确定类型,那么参数就可以使用确定类型的方法
class A {
name:string = "1"
}
class C {
name1:string ="222"
}
function AM(param:A |C) {
if(param instanceof A){
// param.name
//可以使用A的属性和方法
}
}
null 保护
null保护,就是保护部位null。注意嵌套方法嵌套
function nullCheck(a:string | null){
if (a == null){
return ""
}
return a
}
小知识
使用!表示非空断言,a?.b表示a有值,返回a.b的值,没有返回undefined的
字面量保护
可以使用=== == !== !=来区分字面量的类型
type charat = '1' | '2'|'3'
function chara(x:charat) {
//参数X在函数内部也受类型限制
if (x =='1'){
}else if (x=="3")
}
in 保护
in操作符号可以安全的检查一个对象上是否存在一个属性
interface A2 {
A:number
}
interface A3{
B:number
}
// 这里切记,不能使用typeof instanceof 来判断类型,因为接口(interface)
// 在编译阶段为删除掉
function test(a:A2|A3){
if ("A" in a){
//确定类型为A
}
}
自定义类型保护
可以在函数外部定义提个函数用来判断参数的接口类型
interface C {
name:string,
leg:number
}
interface C2 {
name2:string,
leg:number
}
function isC (arg :C|C2): arg is C{
return (arg as C) .name !== undefined
}
function test2(a:C|C2){
if (isC(a)){
// 确定为C
}
}