【TypeScript】类型守卫

跟着 小满zs 学ts,原文:学习TypeScript类型守卫_类型“{ rsfid: any; rsfname: any; cycletime: any; sor-CSDN博客

类型收缩(收窄)

const isString = (str: any) => typeof str === 'string' || str instanceof String;

typeof 只能返回有限的字符串类型,包括 “string”、“number”、“boolean”、“symbol”、“undefined” 和 “object”。对于函数、数组、null 等类型,typeof 也会返回 “object”。

类型谓词(自定义守卫)

实现一个函数,该函数可以传入任何类型。但是如果是object就检查里面的属性,如果里面的属性是number就取两位小数;如果是string就去除左右空格;如果是函数就执行。

// const isObject = (data:any): data is object => Object.prototype.toString.call(data) === '[object Object]'
// 同理以下写法
const isObject = (data: any) => ({}).toString.call(data) === '[object Object]'
const isFunction = (data: any) => typeof data === 'function'
const isNumber = (data: any): data is number => typeof data === 'number'
const isString = (data: any): data is string => typeof data === 'string'
const fn = (data: any) => {
    if (isObject(data)) {
        let value
        // 遍历不能使用 for in 因为 for in 会遍历原型链上的属性
        Object.keys(data).forEach(key => {
            value = data[key]
            if (isNumber(value)) {
                data[key] = value.toFixed(2)
            }
            if (isString(value)) {
                data[key] = value.trim()
            }
            if (isFunction(value)) {
                // value();
                data[key]();
            }
        })
    }
}
let obj = {
    a: 1.1234,
    b: '  123  ',
    c: function () {
        console.log(this, '函数执行')
    }
}
fn(obj)
console.log(obj)

当函数被单独调用时(例如 value(),nodejs环境 this->undefined / 浏览器环境 this -> window),函数内部的 this 会指向全局对象。所以这里要通过对象自身去调用。

自定义守卫,只能接收布尔值,例如:typeof str === 'string',当成立的时候,data 被赋予类型 string。

  • 11
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小秀_heo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值