TypeScript中的類型縮小、類型謂詞

一. 概覽

TypeScript中的類型縮小的方式有typeof、in等方式進行類型縮小。

二. 類型縮小

  1. typeof
function test(a: string| number | string []) {if(a) {if(typeof a === 'string') {} else if(typeof a === 'number') {}}
}
  1. in關鍵字
nterface ISideBar {hide: () =>void
}interface IModal {close(): void
}interface ITip {close?(): void;hide?: () =>void
}
type TypeComponent = ISideBar |  IModal | ITipfunction setClose(comp: TypeComponent ) {if( 'hide' in comp) {comp.hide()}comp.close()
}

comp也有可能是Itip類型,所以需要用類型斷言

function setClose(comp: TypeComponent ) {if( 'hide' in comp) {(comp as ISideBar).hide()}(comp as IModal).close()
}

三. 類型謂詞

之前有類型謂詞的相關介紹 TypeScript中的 | 分隔符、& 運算符、類型謂詞is,現在在此基礎上加以補充


function isString(str: unknown): boolean{  return typeof str === 'string';  
}  function formatArr(str: unknown): string[] {  if (isString(str) && str !== '') {  return str.split("");  } else {  return [];  }  
}

有編譯報錯:
(parameter) str: unknown
對象的類型為 “unknown”。

引入類型謂詞進行解決

function isString(str: unknown): str is string{  return typeof str === 'string';  
}  function formatArr(str: unknown): string[] {  if (isString(str) && str !== '') {  return str.split("");  } else {  return [];  }  
}

在 TypeScript 中,使用類型謂詞 is 可以幫助我們限制函數的輸入參數類型。但是,這種類型謂詞并不能直接限制函數的返回值類型。

要限制函數的返回值類型,可以使用 TypeScript 中的類型別名和類型斷言。通過定義一個類型別名,可以指定函數的返回值類型。然后,在函數內部使用類型斷言來確保返回值符合預期的類型。

// 定義一個類型別名,指定返回值類型為字符串數組  
type StringArray = string[];  function isString(str: unknown): str is string {  return typeof str === 'string';  
}  // 定義一個函數,返回值為字符串數組  
function getStrings(): StringArray {  // 使用類型斷言,將參數限制為字符串類型,并返回字符串數組  const strings: StringArray = [  'Hello',  'World',  'TypeScript'  ];  return strings;  
}  // 使用類型斷言,將函數返回值限制為字符串數組類型  
const result = getStrings() as StringArray;  
console.log(result); // 輸出: [ 'Hello', 'World', 'TypeScript' ]

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/214213.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/214213.shtml
英文地址,請注明出處:http://en.pswp.cn/news/214213.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mybatis-plus查詢的字段和mysql關鍵字重名

先看一下這個 TableField("show") 這個注解表示當前屬性對應在數據庫的字段為show,但是show在mysql中為關鍵字,直接查詢會導致語法錯誤 正確寫法應該是 但寫sql由和mybatis-plus理念相違背, 并且無法輕松創建對應方法&#xff0…

第8課 SQL入門之使用數據處理函數

文章目錄 8.1 函數8.2 使用函數8.2.1 文本處理函數8.2.2 日期和時間處理函數8.2.3 數值處理函數 表8-3 常用數值處理函數 這一課介紹什么是函數,DBMS支持何種函數,以及如何使用這些函數;還將講解為什么SQL函數的使用可能會帶來問題。 8.1 函數…

數據結構之----邏輯結構、物理結構

數據結構之----邏輯結構、物理結構 目前我們常見的數據結構分別有: 數組、鏈表、棧、隊列、哈希表、樹、堆、圖 而它們可以從 邏輯結構和物理結構兩個維度進行分類。 什么是邏輯結構? 邏輯結構是指數據元素之間的邏輯關系,而邏輯結構又分為…

HCIA-H12-811題目解析(5)

1、【單選題】 以下關于Hybrid端口說法正確的有? 2、【單選題】使用命令"vlan batch 10 20"和"valn batch 10 to 20",分別能創建的vlan數量是?() 3、【單選題】二層ACL的編號范圍是?…

Scala日志log4j,序列化Gson

一、日志輸出log4j 1. Scala中配置log4j依賴 對于 Maven 項目,可以在 pom.xml 文件中添加以下內容: <dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version> </dependency>2.創建…

VueUse工具庫

VueUse VueUse不是Vue.use&#xff0c;它是為Vue 2和3服務的一套Vue Composition API的常用工具集&#xff0c;是目前世界上Star最高的同類型庫之一。它的初衷就是將一切原本并不支持響應式的JS API變得支持響應式&#xff0c;省去程序員自己寫相關代碼。 VueUse 是一個基于 …

Java畢業設計 SSM SpringBoot 在線學習系統

Java畢業設計 SSM SpringBoot 在線學習系統 SSM SpringBoot 在線學習系統 功能介紹 首頁 圖片輪播 視頻推薦 在線學習 學習介紹 評論 收藏 資料中心 資料詳情 下載資料 話題討論 文檔發布 試題中心 系統公告 登錄 注冊學生 個人中心 試題記錄 錯題本 我的收藏 算法演示 結果分…

C語言 害死人不償命的(3n+1)算法 挖掘機技術哪家強 選擇排序 貪心算法

1.害死人不償命的&#xff08;3n1)算法 卡拉茲( Calatz)猜想: 對任何一個自然數n,如果它是偶數,那么把它砍掉一半;如果它是奇數,那么把(3n1)砍掉一半。這樣一直反復砍下去,最后一定在某一步得到n1。卡拉茲在1950年的世界數學家大會上公布了這個猜想,傳說當時耶魯大學師生齊動員…

持續集成交付CICD:Jenkins使用GitLab共享庫實現前后端項目Sonarqube

目錄 一、實驗 1.Jenkins使用GitLab共享庫實現后端項目Sonarqube 2.優化GitLab共享庫 3.Jenkins使用GitLab共享庫實現前端項目Sonarqube 4.Jenkins通過插件方式進行優化 二、問題 1.sonar-scanner 未找到命令 2.npm 未找到命令 一、實驗 1.Jenkins使用GitLab共享庫實現…

Vue學習筆記-Vue3中ref和reactive函數的使用

前言 為了讓vue3中的數據變成響應式&#xff0c;需要使用ref,reactive函數 ref函數使用方式 導入ref函數 import {ref} from vue在setup函數中&#xff0c;將需要響應式的數據通過ref函數進行包裝&#xff0c;修改響應式數據時&#xff0c;需要通過: ref包裝的響應式對象.val…

Flink之遲到的數據

遲到數據的處理 推遲水位線推進: WatermarkStrategy.<Event>forBoundedOutOfOrderness(Duration.ofSeconds(2))設置窗口延遲關閉&#xff1a;.allowedLateness(Time.seconds(3))使用側流接收遲到的數據: .sideOutputLateData(lateData) public class Flink12_LateDataC…

力扣編程題算法初階之雙指針算法+代碼分析

目錄 第一題&#xff1a;復寫零 第二題&#xff1a;快樂數&#xff1a; 第三題&#xff1a;盛水最多的容器 第四題&#xff1a;有效三角形的個數 第一題&#xff1a;復寫零 力扣&#xff08;LeetCode&#xff09;官網 - 全球極客摯愛的技術成長平臺 思路&#xff1a; 上期…

【SpringBoot教程】SpringBoot 統一異常處理(附核心工具類-ErrorInfoBuilder)

作者簡介&#xff1a;大家好&#xff0c;我是擼代碼的羊駝&#xff0c;前阿里巴巴架構師&#xff0c;現某互聯網公司CTO 聯系v&#xff1a;sulny_ann&#xff08;17362204968&#xff09;&#xff0c;加我進群&#xff0c;大家一起學習&#xff0c;一起進步&#xff0c;一起對抗…

曲線分板機主軸有何特點?如何選擇合適的曲線分板機主軸?

在現代工業領域&#xff0c;分板機主軸作為重要的機械部件&#xff0c;其性能和質量對于生產效率和產品質量具有至關重要的影響。而在這其中&#xff0c;曲線分板機主軸則因為其獨特的優勢而被廣泛應用于PCB電路板的切割和分板。面對市場上眾多的曲線分板機主軸品牌&#xff0c…

【深度學習】loss與梯度與交叉熵的關系

問的GPT3.5 模型訓練時loss與梯度的關系&#xff1f; 在深度學習模型訓練過程中&#xff0c;loss&#xff08;損失函數&#xff09;與梯度&#xff08;gradient&#xff09;之間存在密切關系。損失函數衡量模型在給定輸入上的預測輸出與實際輸出之間的差距&#xff0c;而梯度則…

Leetcode 2958. Length of Longest Subarray With at Most K Frequency

Leetcode 2958. Length of Longest Subarray With at Most K Frequency 1. 解題思路2. 代碼實現 題目鏈接&#xff1a;2958. Length of Longest Subarray With at Most K Frequency 1. 解題思路 這一題思路上其實也很簡單&#xff0c;就是一個滑動窗口的思路&#xff0c;遍歷…

前端知識(十三)——JavaScript監聽按鍵,禁止F12,禁止右鍵,禁止保存網頁【Ctrl+s】等操作

禁止右鍵 document.oncontextmenu new Function("event.returnValuefalse;") //禁用右鍵禁止按鍵 // 監聽按鍵 document.onkeydown function () {// f12if (window.event && window.event.keyCode 123) {alert("F12被禁用");event.keyCode 0…

RNN循環神經網絡python實現

import collections import math import re import random import torch from torch import nn from torch.nn import functional as F from d2l import torch as d2ldef read_txt():# 讀取文本數據with open(./A Study in Drowning.txt, r, encodingutf-8) as f:# 讀取每一行l…

軟件測試之缺陷管理

一、軟件缺陷的基本概念 1、軟件缺陷的基本概念主要分為&#xff1a;缺陷、故障、失效這三種。 &#xff08;1&#xff09;缺陷&#xff08;defect&#xff09;&#xff1a;存在于軟件之中的偏差&#xff0c;可被激活&#xff0c;以靜態的形式存在于軟件內部&#xff0c;相當…

【隱馬爾可夫模型】隱馬爾可夫模型的觀測序列概率計算算法及例題詳解

【隱馬爾可夫模型】用前向算法計算觀測序列概率P&#xff08;O&#xff5c;λ&#xff09;??????? 【隱馬爾可夫模型】用后向算法計算觀測序列概率P&#xff08;O&#xff5c;λ&#xff09; 隱馬爾可夫模型是關于時序的概率模型&#xff0c;描述由一個隱藏的馬爾可夫鏈…