typescript中的类型保护

首先看个例子

enum Type{Strong,Week}
class Black{
    hellowBlack(){console.log(this.rgb))}
    rgb:string = '0,0,0';
}
class White{
   hellowWhite(){console.log(this.hex16)}
   hex16:string = 'ffffff';
}
function getColor(type:Type){
    const color = Type.Strong === type ? new Black() : new White();
    //下面color.hellowBlack|hellowWhite由于没有约束,所以找不到hellowBlack,这时要使用断言color as Black | White
    if((color as Black).hellowBlack){
        (color as Black).hellowBlack();
    }else{
        (color as White).hellowWhite();
    }
    return color
}

上面的代码中,很显然不是一个理想的方案,代码的可读性很差,此时我们就需要用到typescript的类型保护机制;

那么什么是typescript的类型保护机制呢?

答:能在特定的区块中保证变量属于某种确定的类型
可以在此区块中放心的引用此类型的属性,或者调用此类型的方法

1.instanceof关键字

...
function getColor(type:Type){
    const color = Type.Strong === type ? new Black() : new White();
    if(color instanceof Black){
        color.hellowBlack();
    }else{
        color.hellowWhite(); 
    }
    return color
}

2.in 关键字

...
function getColor(type:Type){
    const color = Type.Strong === type ? new Black() : new White();
    if('rgb' in color){ // 'hellowBlack' in color
        color.hellowBlack()
    }else{
        color.hellowWhite
    }
    return color
}

3.typeof 关键字

function (x:string|[]){
    let arr= [];
    if(typeof x === 'string'){ // 'hellowBlack' in colo
        arr = x.split(',');
    }else{
        arr = x.splice(0,1)
    }
    return x;
}

 4.is:创建类型保护函数

我们来改造1中的例子:首先添加一个isBlack函数,然后通过isBlack来判断当前参数

enum Type{...}
class Black{...}
class White{...}

//使用 is 来确认参数 color 是一个 Black 类型
function isBlack(color:Black|White):color is Black{
    return (color as Black).hellowBlack !== undefined;
};
function getColor(type:Type,x:string|[]){
    const color = Type.Strong === type ? new Black() : new White();
    if(isBlack(color)){
        color.hellowBlack()
    }else{
        color.hellowWhite()
    }
    return color;
}

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TypeScript,有几种方法可以用来判断类型。其一种方法是使用typeof操作符。通过typeof v === "typename"或typeof v !== "typename"的形式,可以判断一个变量的类型是否为"number","string","boolean"或"symbol"等。但是需要注意的是,TypeScript并不会阻止你与其他字符串进行比较,这些表达式不会被识别为类型保护。\[1\] 另一种方法是使用instanceof关键字。通过使用instanceof关键字,可以判断一个对象是否属于某个类或接口的实例。例如,在一个泛型函数,可以使用extends关键字约束泛型类型T必须是某个对象类型的子类型,然后使用keyof操作符获取T类型的所有键,最后使用extends关键字约束K类型必须是keyof T联合类型的子类型。这样就可以在函数使用obj\[key\]来获取对象的属性值。\[2\] 此外,TypeScript还提供了联合类型的概念。联合类型允许一个变量具有多种可能的类型。例如,可以使用string | boolean来声明一个变量,该变量可以是字符串类型或布尔类型。\[3\] 综上所述,TypeScript提供了多种方法来判断类型,包括typeof操作符、instanceof关键字和联合类型。这些方法可以根据具体的需求来选择使用。 #### 引用[.reference_title] - *1* *3* [TypeScript 类型检查总结](https://blog.csdn.net/m0_45406092/article/details/106854643)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [typescript类型判断](https://blog.csdn.net/meng16/article/details/111404848)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值