面試題-在ts中類型轉換的方法

在 TypeScript 中,類型轉換主要分為?類型斷言(Type Assertion)類型守衛(Type Guard)?和?類型兼容轉換?三種方式。以下是詳細分類和示例:

一、類型斷言(Type Assertion)

強制編譯器將值視為特定類型,不改變運行時行為。

1.?尖括號語法
let value: any = "hello";
let length: number = (<string>value).length;
2.?as 語法(更推薦,JSX 中必須使用)
let value: any = "hello";
let length: number = (value as string).length;
3.?非空斷言(Non-null Assertion)

斷言值不為?null?或?undefined

function printLength(str: string | null) {console.log((str!).length); // 斷言 str 不為 null
}

二、類型守衛(Type Guard)

在運行時檢查類型,縮小類型范圍。

1.?typeof 守衛
function add(a: number | string, b: number | string): number {if (typeof a === "number" && typeof b === "number") {return a + b; // a 和 b 被縮小為 number}return Number(a) + Number(b);
}
2.?instanceof 守衛
class Animal { speak() {} }
class Dog extends Animal { bark() {} }function printPet(pet: Animal) {if (pet instanceof Dog) {pet.bark(); // pet 被縮小為 Dog}
}
3.?自定義類型守衛
interface Fish { swim: () => void }
interface Bird { fly: () => void }function isFish(pet: Fish | Bird): pet is Fish {return (pet as Fish).swim !== undefined;
}function move(pet: Fish | Bird) {if (isFish(pet)) {pet.swim(); // 類型為 Fish} else {pet.fly();  // 類型為 Bird}
}

三、類型兼容轉換

基于類型結構的隱式轉換(無需斷言)。

1.?子類型賦值給父類型
interface Animal { name: string }
interface Dog extends Animal { breed: string }let dog: Dog = { name: "Buddy", breed: "Labrador" };
let animal: Animal = dog; // 合法:Dog 是 Animal 的子類型
2.?聯合類型轉換
let value: string | number = "hello";
let str: string = value as string; // 斷言為 string

四、類型轉換工具類型

1.?typeof

獲取值的類型:

const person = { name: "Alice", age: 30 };
type PersonType = typeof person; // { name: string; age: number }
2.?keyof

獲取類型的所有屬性名:

type PersonKeys = keyof typeof person; // "name" | "age"
3.?類型映射
type ReadonlyPerson = Readonly<typeof person>; // 所有屬性變為只讀

五、運行時類型轉換

實際修改值的類型(與 TypeScript 類型系統無關)。

1.?轉字符串
String(123);          // "123"
JSON.stringify({});   // "{}"
2.?轉數字
Number("42");         // 42
parseInt("10px");     // 10
+"5";                 // 5(一元加號)
3.?轉布爾值
Boolean(0);           // false
!!null;               // false(雙重否定)

六、常見陷阱與最佳實踐

  1. 過度使用斷言

    • 避免使用?as any?繞過類型檢查,優先使用類型守衛。
  2. 類型守衛與斷言的區別

    • 類型守衛:運行時檢查,真正縮小類型范圍。
    • 類型斷言:僅告知編譯器類型,不驗證值的實際類型。
  3. 使用類型謂詞(Type Predicate)

    function isString(value: any): value is string {return typeof value === "string";
    }
    

總結

場景方法示例
強制類型轉換(編譯時)類型斷言(as 或 <>)(value as string).length
運行時類型檢查類型守衛(typeof/instanceof)if (typeof x === 'number') { ... }
獲取已有類型typeoftype T = typeof obj
轉換值的實際類型String()/Number()/Boolean()Number("42")
泛型約束extendsfunction identity<T extends string>(x: T)

合理使用這些工具,可以讓你的 TypeScript 代碼既安全又靈活。

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

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

相關文章

IIS配置SSL證書

公司的一個項目使用IIS部署的網站&#xff0c;現在需要更新SSL證書。為了下次方便&#xff0c;在此做記錄整理。 以下第一部分是查網絡AI查詢到的資料&#xff0c;解決了我心中對雙擊和從IIS導入有什么不同的疑惑。第二部分是我在這次實際操作過程中的截圖。 一.證書安裝方式 …

K8s初始化容器與邊車容器比對

Kubernetes 中的初始化容器和邊車容器 Kubernetes 作為一個開源容器編排平臺&#xff0c;引入了強大的概念來管理和增強 Pod 內容器的功能。其中兩個概念是初始化容器&#xff08;Init Containers&#xff09;和邊車容器&#xff08;Sidecar Containers&#xff09;。盡管這兩…

無線Debugger攻防全解:原理剖析與突破之道

引言?? 在Web安全防護體系中&#xff0c;反調試技術已成為對抗爬蟲和分析的關鍵武器。2023年OWASP報告顯示&#xff0c;Top 1000網站中92%部署了反調試機制&#xff0c;其中??無線Debugger技術??&#xff08;也稱為無限Debug&#xff09;因其難以破解的特性&#xff0c;…

Eslint自定義規則使用

文章目錄 前言場景設定&#xff1a;維護代碼分層&#xff0c;禁止“跨級調用”實現步驟&#xff1a;從零到一&#xff0c;創建你的第一條自定義規則**第 1 步&#xff1a;創建規則文件****第 2 步&#xff1a;在 eslint.config.mjs 中注冊并啟用你的規則** 驗證成果 前言 設計…

深入剖析Spring Cloud Gateway,自定義過濾器+斷言組合成攔截器鏈實現Token認證

一、Spring Cloud Gateway網關的整體架構 Spring Cloud Gateway 是 Spring Cloud 官方推出的網關解決方案&#xff0c;旨在替代 Netflix Zuul 1.x。其底層基于 Spring WebFlux Reactor 模型 構建&#xff0c;具備響應式、異步非阻塞的高性能特點。 1. 整體架構圖 ----------…

VMware Workstation Pro下Centos 7.9 安裝

背景系統安裝方案1、VMware安裝? ? 1.1、下載? ? 1.2、安裝 2、Centos 7.9 安裝? ? 2.1 、Centos7.9 iso 下載? ? 2.2、使用VMware 安裝? ? 2.2.1、VMware配置虛擬機? ? 2.2.2、Linux安裝 結語 背景 本文所在專欄的所有文章基于Centos7.9系統來演示&#xff0c;系…

我做個一個APP叫【圖影工具箱】:一站式解決視頻提取音頻和加水印的鴻蒙神器

在數字內容創作和日常使用手機的過程中&#xff0c;提取視頻音頻、處理圖片和視頻水印是一大需求。許多人在尋找合適的軟件時&#xff0c;往往試遍各種工具卻仍無法滿足需求。所以&#xff0c;我做了一款應用 —— 圖影工具箱&#xff0c;一站式解決這些令人頭疼的問題。 圖影…

【StarRocks系列】查詢語句執行全流程

目錄 StarRocks 查詢數據流程詳解 1. 提交查詢語句 2. FE 解析與優化 3. 選擇 BE 節點與數據路由 4. BE 數據讀取與計算 5. 結果返回 關鍵優化點總結 示例流程 流程圖 StarRocks 查詢數據流程詳解 StarRocks 采用分布式 MPP 架構&#xff0c;查詢流程涉及 FE&#xff…

HarmonyOS 5的分布式通信矩陣是如何工作的?

HarmonyOS 5 的分布式通信矩陣通過多層級技術協同實現跨設備高效協同&#xff0c;其核心工作機制如下&#xff1a; 一、核心架構&#xff1a;分布式軟總線 3.0? ?動態拓撲感知? 設備自動發現并構建最優傳輸路徑&#xff08;如手機與智慧屏優先采用 Wi-Fi P2P 直連&#xf…

自定義Django rest_framework中response的示例

在實際項目開發中&#xff0c;原有框架的response可能并不能完全滿足我們的需求。比如我們需要定義一些更加詳細的RESULT_CODE來說明情況。那么我們就可以基于原有的response進行自定義。 下面是一個自定義Django rest_framework中response的示例 # -*- coding:utf-8 -*- imp…

如何開發HarmonyOS 5的分布式通信功能?

以下是基于HarmonyOS 5開發分布式通信功能的完整技術指南&#xff0c;涵蓋核心流程與關鍵代碼實現&#xff1a; 一、開發前置配置 權限聲明? 在module.json5中添加分布式權限&#xff1a; {"module": {"requestPermissions": [{"name": &quo…

Linux --靜態庫和動態庫的制作和原理

本章重點&#xff1a; 動靜態庫的制作&#xff0c;使用和查找 可執行程序ELF格式 可執行程序的加載過程 虛擬地址空間和動態庫加載的過程 動靜態庫的制作&#xff0c;使用和查找 1.在了解庫的制作之前&#xff0c;我們首先需要知道什么是庫。庫是寫好的現有的&#xff0c;成…

50天50個小項目 (Vue3 + Tailwindcss V4) ? | IncrementingCounter(遞增計數器)

&#x1f4c5; 我們繼續 50 個小項目挑戰&#xff01;—— IncrementingCounter組件 倉庫地址&#xff1a;https://github.com/SunACong/50-vue-projects 項目預覽地址&#xff1a;https://50-vue-projects.vercel.app/ 使用 Vue 3 的 Composition API 和 <script setup&g…

簡約求職簡歷競聘工作求職PPT模版共享

簡歷競聘&#xff0c;自我介紹&#xff0c;個人簡歷&#xff0c;工作求職PPT模版&#xff0c;崗位競聘求職簡歷PPT模版&#xff0c;低調綠自我介紹PPT模版&#xff0c;簡約求職簡歷PPT模版&#xff0c;個人介紹PPT模版&#xff0c;我的簡歷PPT模版&#xff0c;個人求職簡介PPT模…

Java大廠面試攻略:Spring Boot與微服務架構深度剖析

問題一&#xff1a;Spring Boot 的自動配置原理是什么&#xff1f; 簡潔面試回答&#xff1a; Spring Boot 的自動配置基于條件化配置&#xff0c;通過 Conditional 注解實現&#xff0c;根據項目中依賴和環境自動裝配 Bean。 詳細解析&#xff1a; Spring Boot 自動配置的核…

Windows核心端口攻防全解析:135、139、445端口的技術內幕與安全實踐

Windows核心端口攻防全解析&#xff1a;135、139、445端口的技術內幕與安全實踐 引言&#xff1a;Windows網絡通信的命脈 在Windows網絡生態系統中&#xff0c;135、139和445端口猶如網絡通信的"大動脈"&#xff0c;承載著關鍵的系統服務和網絡功能。這些端口不僅是…

從生活場景學透 JavaScript 原型與原型鏈

一、構造函數&#xff1a;以 “人” 為例的對象工廠 1. 生活場景下的構造函數定義 我們以 “人” 為場景創建構造函數&#xff0c;每個人都有姓名、年齡等個性化屬性&#xff0c;也有人類共有的特征&#xff1a; // 人類構造函數 function Person(name, age) {this.name na…

學c++ cpp 可以投遞哪些崗位

此次描述知識針對應屆生來說哈&#xff0c;如果是社招&#xff0c;更多是對于你目前從事的方向&#xff0c;技術棧進行招聘就好了。 此次編寫是按照boss上崗位篩選的方式進行編寫的&#xff0c;其實投簡歷一般也是用boss&#xff0c;后面也會出一篇文章給大家介紹一般找工作都用…

【Docker基礎】Docker鏡像管理:docker rmi、prune詳解

目錄 引言 1 Docker鏡像管理概述 1.1 為什么需要鏡像清理&#xff1f; 1.2 鏡像生命周期管理 2 docker rmi命令詳解 2.1 基本語法 2.2 常用選項 2.3 刪除單個鏡像 2.4 刪除多個鏡像 2.5 強制刪除鏡像 2.6 刪除所有鏡像 3 docker rmi工作原理 3.1 鏡像刪除流程 3.…

57-Oracle SQL Profile(23ai)實操

在上一期中說到了SQL Tuning Advisor其中一個影響對象就是SQL Profile&#xff0c;同樣在管理和應用開發中,SQL性能優化是個任重道遠的工作&#xff0c;低效的SQL語句讓應用響應緩慢,用戶整體體驗下降,拖垮搞蹦整個系統都有可能。Oracle數據庫提供了多種組合工具&#xff0c;有…