zoukankan      html  css  js  c++  java
  • [TypeScript] Using Assertion to Convert Types in TypeScript

    Sometimes the compiler needs help figuring out a type. In this lesson we learn how to help out the compiler with Typescript type assertion.

    We have a SuperHero and a BadGuy. Let's make a function that saves the day if the function's argument is a SuperHero, and a commits a bad deed if its argument is a BadGuy. Our function needs to accept something that could be a SuperHero or a BadGuy.

    interface SuperHero {
      powers: string[];
      savesTheDay: () => void;
    }
    
    interface BadGuy {
      badDeeds: string[];
      getRandomBadDeed: () => string;
      commitBadDeed: () => void;
    }
    
    function saveDayOrBadDeed(something: SuperHero | BadGuy) {
      if (something.powers) {}
    }

    The IDE is telling us something's wrong. 

    assertion.ts(24,19): error TS2339: Poperty 'powers' does not exist on type 'SuperHero | BadGuy'.

    This is because the compiler is evaluating both types of the union-type argument. Since the BadGuy doesn't have powers, something doesn't have powers. We can get a hold of the SuperHero's power's property by asserting that something is a SuperHero.

    An assertion is how we told the compiler, "We have some information about something's type that it doesn't." There are two different syntaxes for assertion. We're using the as type syntax, which goes behind the value. We're putting something in parens in order to isolate it from its property. If we remove the parens we can't make the assertion.

    function saveDayOrBadDeed(something: SuperHero | BadGuy) {
      if ((something as SuperHero).powers) {}
    }
    
    //or 
    
    if (<SuperHero>something.powers) {} // angle bracket syntax, doesn't work with JSX
    function saveDayOrBadDeed(something: SuperHero | BadGuy) {
      if ((something as SuperHero).powers) {
        (something as SuperHero).savesTheDay();
      } else {
        (something as BadGuy).commitBadDeed();
      }
    }
    
    saveDayOrBadDeed(dazzler); // Dazzler transduces sonic vibrations into light to save the day!!!
    saveDayOrBadDeed(badGuy); // BadGuy farts on old folks
  • 相关阅读:
    vue-router在两个以上子路由的情况下,跳转出错
    全局window下添加可变量
    nuxtjs 环境中添加全局axios
    nuxt.js 初始化 npm run dev 报错
    replace的回调函数。
    JS面向对象的类 实例化与继承
    DOM事件: DOM事件级别、DOM事件流、DOM事件模型、DOM事件捕获过程、自定义事件
    sync 简单实现 父子组件的双向绑定
    cube-ui 重构饿了吗Webapp的 scroll-nav域名插槽问题
    在element table中导出指定列信息
  • 原文地址:https://www.cnblogs.com/Answer1215/p/5961916.html
Copyright © 2011-2022 走看看