最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • Ts 学习 02----------青涩少年爱上TS

    正文概述 掘金(DARRY~)   2021-01-24   460

    类型别名和类型断言

    类型别名(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 方法,就会导致运行时错误了。

    总之,使用类型断言时一定要格外小心,尽量避免断言后调用方法或引用深层属性,以减少不必要的运行时错误。

    其中类型断言在类中也有广泛的应用,大家如果有兴趣的话,可以自行去查阅这一部分的内容,本文暂不做详细介绍。


    起源地下载网 » Ts 学习 02----------青涩少年爱上TS

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元