国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

五種在 TypeScript 中使用類型保護的方法

開發 前端
類型保護是一個執行運行時檢查的表達式,以保證某個范圍內的類型。類型保護的一個典型應用場景是縮小聯合類型的類型范圍。這是為了保證類型安全,即在運行時安全地訪問特定類型對象中的特定屬性或方法。

類型保護是一個執行運行時檢查的表達式,以保證某個范圍內的類型。類型保護的一個典型應用場景是縮小聯合類型的類型范圍。這是為了保證類型安全,即在運行時安全地訪問特定類型對象中的特定屬性或方法。

在這篇文章中,我將介紹 5 種實現類型保護的方法。

01、typeof 類型保護

首先我們來介紹一下比較常見的typeof類型防護。typeof 運算符可以在運行時獲取對象的類型,該運算符返回以下可能的值:

  • "string"
  • "number"
  • "bigint"
  • "boolean"
  • "symbol"
  • "undefined"
  • "object"
  • "function"

因此使用 typeof 運算符,我們可以在運行時獲取變量的實際類型。舉個例子:

function printId(id: string | number) {
  if (typeof id === "string") {
    console.log(`ID: ${id.toUpperCase()}`);
  } else if (typeof id === "number") {
    console.log(`ID: ${id}`);
  }
}

在上面的代碼中,我們定義了一個 printId 函數,它包含一個 id 參數,其類型為字符串 | 數字聯合類型。

在函數體中,我們使用 typeof 運算符來確定參數的實際類型。如果id參數是字符串類型,我們會將其值轉換為大寫后再輸出。

那么為什么要使用 typeof 運算符來縮小 id 參數的類型呢?主要原因是為了保證運行時的類型安全。例如,當id參數的類型是數字類型時,但是我們調用id.toUpperCase()方法,就會拋出運行時異常。

在支持 TypeScript IntelliSense 的編輯器中,當您訪問 id 參數的某些屬性時,只能訪問字符串和數字類型的公共屬性。具體如下圖所示:

02、instanceof 類型守衛

雖然typeof運算符可以區分不同的類型,但如果我們想判斷一個對象是否是某個類的實例,從而安全地訪問該實例上特有的屬性或方法,那么typeof運算符就無能為力了。

對于這個需求,我們可以使用instanceof運算符。再次,我們舉一個具體的例子:

class Shape {
  constructor(public id: string) {}
}


class Circle extends Shape {
  constructor(
    public id: string, 
    public radius: number) {
   super(id);
  }
}


class Square extends Shape {
  constructor(
    public id: string, 
    public sideLength: number) {
      super(id);
  }
}

在上面的代碼中,我們定義了一個Shape類,并基于它創建了兩個子類。接下來,我們定義一個 printShapeInfo 函數來打印有關不同形狀的信息:

function printShapeInfo(shape: Shape) {
  if (shape instanceof Circle) {
    console.log(`Circle's radius is: ${shape.radius}`);
  } else if (shape instanceof Square) {
    console.log(`Square's sideLength is: ${shape.sideLength}`);
  }
}

在printShapeInfo函數體中,我們使用instanceof運算符來縮小形狀參數的類型,從而輸出不同形狀的信息。在 if...else if 分支之外,我們只能訪問 Circle 對象和 Square 對象共有的 id 屬性。

03、in type guards

對于前面使用instanceof運算符實現類型保護的示例,我們還可以使用接口的形式來描述Shape、Circle和Square類型。

interface Shape {
  id: string;
}


interface Circle extends Shape {
  radius: number;
}


interface Square extends Shape {
  sideLength: number;
}

由于TypeScript接口定義的類型在編譯后并不會生成對應的類型,因此我們無法在運行時使用instanceof運算符進行類型檢測。要實現printShapeInfo函數的功能,我們可以使用in運算符,具體實現如下:

function printShapeInfo(shape: Shape) {
  if ("radius" in shape) {
    console.log(`Circle's radius is: ${shape.radius}`);
  } else if ("sideLength" in shape) {
    console.log(`Square's sideLength is: ${shape.sideLength}`);
  }
}

除了上述方法之外,我們還可以使用可判別聯合類型來表示Shape類型:

type Circle = {
  id: string;
  type: "circle";
  radius: number;
};


type Square = {
  id: string;
  type: "square";
  sideLength: number;
};


type Shape = Circle | Square;

在Circle和Square類型中,type屬性的類型是字符串文字類型,用于區分不同的形狀,稱為可區分屬性。對于判別聯合類型,結合switch…case語句,我們還可以實現printShapeInfo函數對應的功能。

function printShapeInfo(shape: Shape) {
  switch (shape.type) {
    case "circle":
      console.log(`Circle's radius is: ${shape.radius}`);
      break;
    case "square":
      console.log(`Square's sideLength is: ${shape.sideLength}`);
      break;
    default:
      console.log("Unknown shape");
  }
}

介紹完如何使用常見的 typeof、instanceof 和 in 運算符實現類型保護之后,我們來介紹一下如何定義用戶自定義的類型保護。

04、用戶定義的類型保護

為了演示用戶定義的類型保護,讓我們重新定義 3 種類型:

interface Shape {
  id: string;
}


interface Circle extends Shape {
  radius: number;
}


interface Square extends Shape {
  sideLength: number;
}

定義完Shape相關的類型后,我們來定義用戶自定義的類型保護函數:

function isCircle(shape: Shape): shape is Circle {
  return "radius" in shape;
}


function isSquare(shape: Shape): shape is Square {
  return "sideLength" in shape;
}

與普通函數相比,自定義類型保護函數返回類型謂詞。上面代碼中的 shape is Circle 就是所謂的類型謂詞。謂詞采用parameterName is Type 的形式,其中parameterName 必須是當前函數簽名中的參數名稱。

這樣就可以理解isCircle用戶自定義類型保護函數的作用了。如果函數返回值為true,則shape參數的類型為Circle類型。

現在我們有了 isCircle 和 isSquare 函數,我們可以在 printShapeInfo 函數中使用它們,如下所示:

function printShapeInfo(shape: Shape) {
  if (isCircle(shape)) {
    console.log(`Circle's radius is: ${shape.radius}`);
  } else if (isSquare(shape)) {
    console.log(`Square's sideLength is: ${shape.sideLength}`);
  }
}

05、相等縮小類型防護

除了前面描述的 4 種類型保護方法之外,TypeScript 還支持使用 if/switch 語句和相等檢查,例如 ===、!===、== 和 != 運算符來縮小變量的類型。

function printValues(a: string | number, b: string | string[]) {
  if (a === b) {
    console.log(a.toUpperCase()); // (parameter) a: string
    console.log(b.toUpperCase()); // (parameter) b: string
  } else {
    console.log(a); // (parameter) a: string | number
    console.log(b); // (parameter) b: string | string[]
  }
}

上面的代碼中,printValues函數支持a和b 2個參數,并且它們的類型都是聯合類型。當a===b表達式的計算結果為true時,參數a和b的類型將縮小為字符串類型。當然,使用!==運算符也可以用來實現類型縮小。

function printValues2(a: string | number, b: string | string[]) {
  if (a !== b) {
    console.log(a); // (parameter) a: string | number
    console.log(b); // (parameter) b: string | string[]
  } else {
    console.log(a.toLowerCase()); // (parameter) a: string
    console.log(b.toLowerCase()); // (parameter) b: string
  }
}

這就是關于 TypeScript 類型防護的全部內容。

總結

以上就是我今天想與你分享的5個TS的知識技能,希望對你有所幫助。

責任編輯:華軒 來源: web前端開發
相關推薦

2010-07-27 13:05:12

Flex

2023-09-27 10:19:37

類型video函數

2025-01-20 00:13:19

TypeScript操作符數據類型

2021-09-14 08:00:00

云計算機器ID技術

2023-10-20 10:17:23

2021-03-05 10:17:32

保護組織勒索軟件網絡安全

2021-08-27 16:26:11

敏感數據

2025-03-03 08:06:39

DeepSeek方法工具

2013-08-26 09:51:57

2020-06-18 10:26:43

JavaScript開發技術

2023-11-21 15:23:15

JavaScript工具

2020-06-04 08:17:44

JavaScript延展操作運算符開發

2022-10-11 16:53:22

GitLinux

2022-08-30 20:00:37

零信任Linkerd

2022-06-10 08:01:17

ReduxReact

2023-05-04 07:09:08

2023-05-05 06:56:13

2011-05-18 14:10:18

敏感數據安全數據泄漏

2023-04-26 15:17:33

Vue 3開發前端

2023-06-02 15:42:51

JavaScript數據結構對象
點贊
收藏

51CTO技術棧公眾號

国产亚洲精品高潮| 日本一道在线观看| 美女av一区| 日韩av影视综合网| 亚洲欧美视频一区二区| 五月天亚洲婷婷| 日本三级黄色网址| 26uuu亚洲| 国产精品国产亚洲精品看不卡| 日韩和的一区二在线| 欧美一区二区国产| 人操人视频在线观看| 亚洲第一精品在线| 日本成本人片免费观看| 91成人精品观看| 精品成人a区在线观看| 日本综合在线| 欧美性视频一区二区三区| 午夜在线观看91| 亚洲大型综合色站| 在线视频1区| 精品久久久一区| 四虎影院在线播放| 在线观看精品一区| 黄色免费在线看| 精品福利在线导航| 大菠萝精品导航| 亚洲人成绝费网站色www | 久久亚洲精品成人| 欧洲一区在线| 日韩免费不卡av| 仙踪林久久久久久久999| 国产主播在线一区| 亚洲理伦在线| 亚洲精品国产精品国自产观看| 黑人精品欧美一区二区蜜桃| 青青草精品视频在线| 91毛片在线观看| 久久久久久久久久久久久久久久久久久| 椎名由奈av一区二区三区| 亚洲大胆精品| 欧美mv日韩mv亚洲| 日本久久一区| 38少妇精品导航| 综合激情婷婷| 熟女熟妇伦久久影院毛片一区二区| av在线播放成人| jizzzz日本| 日韩欧美999| 电影在线观看一区| 久久久久久久色| 韩日成人av| 欧美人成在线观看| 亚洲一区二区三区美女| 在线观看电影av| 欧美成人午夜剧场免费观看| 忘忧草精品久久久久久久高清| 欧美一区二视频在线免费观看| 99re热视频这里只精品| 中文天堂在线观看| 一区二区三区视频免费| 精品在线播放| 亚洲午夜精品一区二区三区| 国产午夜久久久久| 黄色小视频在线免费观看| 亚洲美女性视频| 欧美一级淫片| 天堂а√在线中文在线| 亚洲成人在线网站| 午夜精品成人av| 92看片淫黄大片看国产片| 国产麻豆一精品一av一免费| 性一爱一乱一交一视频| 日韩国产一区三区| 色综合咪咪久久网| 国产免费裸体视频| 在线中文字幕不卡| 波多野结衣在线一区二区| 久久影视中文粉嫩av| 国产欧美日韩在线看| 欧美videos另类精品| 国产91色在线|免| 九九久久精品视频| 性感av在线播放| 久久精品久久久久久国产 免费| 亚洲色图网站| 性刺激的欧美三级视频| 亚洲国产精品中文| 欧美日韩一区二区三区四区在线观看| 激情五月婷婷六月| 欧美理论电影在线| 亚洲图片久久| 国产极品在线视频| 日韩一区二区免费视频| 亚洲69av| av网站在线观看不卡| 欧美一级欧美三级| 亚洲成人精品| 国产美女av| 波霸ol色综合久久| 狠狠色综合日日| 1区2区3区在线观看| 国产精品福利网站| 欧美精彩视频一区二区三区| 成人ssswww在线播放| 精品视频导航| 欧美三级xxx| 国产永久精品大片wwwapp| 国产在线青青草| 日韩精品www| 爽好久久久欧美精品| 久久精品国产亚洲a∨麻豆| 5278欧美一区二区三区| 久久久精品蜜桃| 国产精品99| 国产91视频一区| 日韩风俗一区 二区| 久久精品一区二区三区中文字幕| 992tv在线观看| 97精品国产97久久久久久免费| 成人免费视频一区二区| 伊人春色在线观看| 亚洲一区二区三区乱码aⅴ蜜桃女 亚洲一区二区三区乱码aⅴ | 亚洲第一二三区| 成熟老妇女视频| 日韩亚洲欧美中文高清在线| 国产综合成人久久大片91| 手机在线免费看av| 欧美精品国产精品久久久| 91精品国产综合久久国产大片| 亚洲色图国产| 毛片免费在线| 91成人在线看| 欧美日韩在线播| 亚洲少妇自拍| 国产偷倩在线播放| 欧美xxxx吸乳| 精品国产欧美一区二区三区成人 | 日韩一级特黄| 国产九九九九九| 久久天天躁狠狠躁老女人| 91免费视频网| 国产精品极品| 国产一伦一伦一伦| 欧美激情伊人电影| 欧美国产日韩一二三区| 永久免费精品视频| 美日韩在线观看| 亚洲综合精品一区二区| 欧美日韩国产一级| 免费成人你懂的| 精品成人免费一区二区在线播放| 久操手机在线视频| 久久97久久97精品免视看| 国产精品国产三级国产aⅴ入口| 丝袜连裤袜欧美激情日韩| 两个人hd高清在线观看| 精品乱码一区| 亚洲精品国产无套在线观| 亚洲毛片aa| 久久免费少妇高潮久久精品99| 亚洲黄色在线视频| 激情久久免费视频| 成人午夜影院| 欧美一级电影在线| 欧美性生交大片免网| 久久成人免费网站| 先锋资源久久| 成年人视频免费在线播放| 国产精品午夜av在线| 欧美福利在线观看| 国内精品免费| 国产精品普通话对白| 国产日韩精品一区二区三区| 欧美高清视频在线高清观看mv色露露十八| 日韩中文字幕视频| 精品资源在线| 四虎4hutv紧急入口| 爱情岛论坛vip永久入口| 污影院在线观看| 伊人成综合网| 国产亚洲精品精华液| 亚洲免费观看高清完整版在线观看 | 在线免费成人| 欧美一级大片| 精品国产乱码一区二区三区| 成人精品视频| 亚洲国产网站| 欧美激情一区二区三区| 欧美日韩在线一区| 国产一区二区三区丝袜| 成人中文字幕+乱码+中文字幕| 久久久久久香蕉| 里番在线观看网站| 免费欧美激情| 国产激情视频一区二区在线观看| 欧美性欧美巨大黑白大战| 国产成人精品在线视频| 美脚丝袜脚交一区二区| 免费av在线网址|