【TypeScript】對象類型的定義

簡言

在 JavaScript 中,我們分組和傳遞數據的基本方式是通過對象。在 TypeScript 中,我們通過對象類型來表示這些對象。
在這里插入圖片描述

對象類型

在 JavaScript 中,我們分組和傳遞數據的基本方式是通過對象。在 TypeScript 中,我們通過對象類型來表示這些對象。
正如我們所看到的,它們可以是匿名的:

function greet(person: { name: string; age: number }) {return "Hello " + person.name;
}

或使用接口來命名:

interface Person {name: string;age: number;
}function greet(person: Person) {return "Hello " + person.name;
}

又或者使用別名:

type Person = {name: string;age: number;
};function greet(person: Person) {return "Hello " + person.name;
}

這三種方式都挺常見的,一般都是使用后兩種,使用接口或別名來定義類型,簡單明了,且易復用。

對象屬性類型

對象類型中的每個屬性都可以指定幾件事:類型、屬性是否可選以及屬性是否可以寫入,以及屬性值。
定義規則如下:

  • 屬性類型 – 一般是字符串類型的,如果想定義其他的類型,用方括號包裹定義屬性索引修改。
  • 屬性值 – 和普通的變量類型定義一樣,如果提前定義好了屬性值,則需要符合提前定義好的類型范圍。
  • 可選屬性 — 問號(?)定義。
  • 僅讀屬性 — 屬性默認是可寫入的,僅讀屬性需要 索引前面加 readonly 關鍵詞。

示例:

interface Person {name: string;age: number;
}
type Shape = { kind: "circle" } | { kind: "square" };
interface PaintOptions {shape: Shape;xPos?: number;yPos?: number;
}interface ReadonlyPerson {readonly name: string;readonly age: number;
}let writablePerson: Person = {name: "Person McPersonface",age: 42,
};// works
let readonlyPerson: ReadonlyPerson = writablePerson;console.log(readonlyPerson.age); // prints '42'
writablePerson.age++;
console.log(readonlyPerson.age); // prints '43'interface StringArray {[index: number]: string;
}const myArray: StringArray = ['1','2'];
const secondItem = myArray[1];

對象索引類型

使用方括號包含索引index屬性定義。

interface NumberOrStringDictionary {[index: string]: number | string;length: number; // ok, length is a numbername: string; // ok, name is a string
}

上面提前定義了屬性索引類型和屬性值類型,不好擴展,也可以不指定屬性值,即將屬性值定義為any(任何類型):

interface SquareConfig {[index: string]: any;color?: string;width?: number;
}

可以在索引屬性前加readonly,這樣屬性值不可修改:

interface ReadonlyStringArray {readonly [index: number]: string;
}let myArray: ReadonlyStringArray = getReadOnlyStringArray();
myArray[2] = "Mallory";	//	報錯

接口繼承

使用接口定義的對象類型,可以使用關鍵詞extends來繼承其他接口。

interface Colorful {color: string;
}interface Circle {radius: number;
}interface ColorfulCircle extends Colorful, Circle {}const cc: ColorfulCircle = {color: "red",radius: 42,
};

類型組合

接口允許我們通過擴展其他類型來創建新類型。TypeScript 提供了另一種稱為交叉類型的結構,主要用于組合現有的對象類型。
組合類型是使用 & 運算符定義的。

interface Colorful {color: string;
}
interface Circle {radius: number;
}type ColorfulCircle = Colorful & Circle;type c1 = Colorful
type c2 = Circletype c3 = c1 & c2 // Colorful & Circle

類似于數學中的并集運算。

泛型對象類型

可以使用泛型,來定義通用的對象類型。

interface Box<Type> {contents: Type;
}
//	別名也可以使用泛型
type OrNull<Type> = Type | null;type OneOrMany<Type> = Type | Type[];type OneOrManyOrNull<Type> = OrNull<OneOrMany<Type>>;

使用時,指定Type具體的類型值,其contents屬性即可動態改變。

let box: Box<string>;

將 Box 視為真實類型的模板,其中 Type 是一個占位符,將被其他類型替換。當 TypeScript 看到 Box<string> 時,它會用 string 替換 Box<Type> 中 Type 的每一個實例,并最終使用 { contents: string } 這樣的代碼。

元組對象類型

元組有的時候在表示列表對象類型時特別適合。

function doSomething(stringHash: [string, number]) {const [inputString, hash] = stringHash;console.log(inputString);console.log(hash);
}

元組也可以使用剩余元素,但必須是數組/元組類型。

type StringNumberBooleans = [string, number, ...boolean[]];
type StringBooleansNumber = [string, ...boolean[], number];
type BooleansStringNumber = [...boolean[], string, number];

為什么可選元素和剩余元素會有用?因為它允許 TypeScript 將元組與參數列表對應起來。元組類型可用于其余參數和參數,因此:

function readButtonInput(...args: [string, number, ...boolean[]]) {const [name, version, ...input] = args;// ...
}
//	相當于
function readButtonInput2(name: string, version: number, ...input: boolean[]) {// ...
}

結語

結束了。

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

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

相關文章

Blender雕刻建模_筆刷紋理和頂點繪制

筆刷紋理 主要用于皮膚&#xff0c;紋理的雕刻。 可以修改映射方式來實現不同繪制效果。 用一張紋理來定義筆刷各個點的強度。其中白色為1&#xff0c;黑色為0。 設置筆刷紋理步驟&#xff1a; -新建一套筆刷 -強度&#xff0c;設為0.15&#xff08;可以根據需求修改&#x…

Visual Studio中的內存檢測工具:程序員的必備神器

在軟件開發的廣闊海洋中&#xff0c;Visual Studio&#xff08;VS&#xff09;如同一位全能的船長&#xff0c;不僅提供了豐富的代碼編輯和調試功能&#xff0c;還內置了多種實用的開發工具&#xff0c;其中內存檢測工具更是程序員定位和解決內存泄漏問題的得力助手。本文將詳細…

ACWing471. 棋盤-DFS剪枝

題目 思路 本思路參考博客AcWing 471. 棋盤 - AcWing 約束方程&#xff1a; 代碼 #include <iostream> #include <cstring> #include <algorithm>using namespace std;const int N 110, INF 0x3f3f3f3f; int g[N][N], n, m, dist[N][N]; int dx[4] {-1…

接口自動化-requests庫

requests庫是用來發送請求的庫&#xff0c;本篇用來講解requests庫的基本使用。 1.安裝requests庫 pip install requests 2.requests庫底層方法的調用邏輯 &#xff08;1&#xff09;get / post / put / delete 四種方法底層調用 request方法 注意&#xff1a;data和json都…

基于Java+SpringBoot+Mybaties-plus+Vue+elememt 駕校管理系統 設計與實現

一.項目介紹 系統角色&#xff1a;管理員、駕校教練、學員 管理員&#xff1a; 個人中心&#xff1a;修改密碼以及個人信息修改 學員管理&#xff1a;維護學員信息&#xff0c;維護學員成績信息 駕校教練管理&#xff1a;駕校教練信息的維護 駕校車輛管理&…

在Python中,f代表著格式化字符串

在Python中&#xff0c;f代表著格式化字符串&#xff08;Formatted String&#xff09;。格式化字符串是一種方便的字符串表示形式&#xff0c;它允許您在字符串中包含變量值&#xff0c;并在運行時將其替換為實際值。使用格式化字符串&#xff0c;您可以更輕松地構建復雜的字符…

java排課算法簡單demo

簡化的場景設定 有限的教室數量。每個教師可以教授多個課程。每個課程在一個特定的時間段內只能安排一次。考慮教室容量和課程需求。 Java代碼實現 首先&#xff0c;我們定義幾個基本的類&#xff1a;Course、Teacher、Room 和 TimeSlot。 import java.util.ArrayList; imp…

【R語言】ggplot中點的樣式shape參數匯總

ggplot中點的樣式展示&#xff1a; library(ggplot2)# 創建數據框 a<- data.frame(x 0:25, y 0:25) # 創建散點圖 ggplot(a, aes(x x, y y, shape as.factor(y))) geom_point(size 4) scale_shape_manual(values 0:25) labs(shape "形狀") theme(legend.…

產品經理如何進行項目管理?

產品經理如何進行項目管理&#xff1f; 項目管理和產品管理在本質上還是有一定差別的。產品更關注的是產品、功能、方向和反饋&#xff0c;而項目則更關注進度、質量和測試等。如果團隊沒有項目經理&#xff0c;那么產品經理就需要兼顧對開發人員、項目進度等進行管理。 此時…

K8S搭建

文章目錄 K8S搭建配置要求 安裝 Kuboard-Spray加載離線資源包規劃并安裝集群訪問集群重啟Kubernetes集群Worker節點不能啟動許多Pod一直Crash或不能正常訪問 containerd配置網絡代理 常用的 kubectl 命令&#xff1a; K8S搭建 安裝高可用的Kubernetes集群 配置要求 對于 Kub…

【Linux】高效文本處理命令

目錄 一.sort命令&#xff08;排序&#xff09; 1.語法格式 2.常用選項 3.相關示例 3.1. 3.2. 二.unip命令&#xff08;去重&#xff09; 1.語法格式 2.常用選項 3.相關示例 3.1. 3.2. 三.tr命令&#xff08;替換&#xff09; 1.語法格式 2.常用選項 3.相關示例…

TiDB學習2:TiDB Sever

目錄 1. TiDB Server架構 2. sql語句的解析和編譯 2.1 Parse ?編輯 2.2 compile 3. 行轉化為KV對(聚簇表) ?編輯4. SQL 讀寫相關模塊 4.1 DistSQL(復雜查詢) 4.2 KV(簡單查詢) 5. 在線DDL相關模塊 6. GC機制與相關模塊 7. TiDB Server的緩存 8. 熱點小表緩存 9. …

c++ fs::rename

【C 17 新特性 文件管理】探索C Filesystem庫&#xff1a;文件和目錄操作的全面指南&#xff08;一&#xff09;-阿里云開發者社區 fs::rename("old_directory", "new_directory"); 底層原理: 在Linux系統中&#xff0c;這通常通過rename系統調用來實現。…

做好串口控制是源代碼防泄密的基礎

在信息化時代&#xff0c;數據安全與保密工作的重要性日益凸顯。尤其是在涉密單位&#xff0c;如軍工、政府、金融等行業&#xff0c;防泄密工作直接關系到國家安全、社會穩定和企業利益。串口作為計算機與外部設備通信的重要接口&#xff0c;其安全性同樣不容忽視。本文將探討…

react18【系列實用教程】useMemo —— 緩存數據 (2024最新版)

為什么添加了 memo &#xff0c;子組件2依然重新渲染了呢&#xff1f; 因為父組件向子組件2傳遞了引用類型的數據 const userInfo {name: "朝陽",};<Child2 userInfo{userInfo} />memo() 函數的本質是通過校驗Props中數據的內存地址是否改變來決定組件是否重新…

TEMU電商行情分析:未來趨勢與盈利機遇探討

近年來&#xff0c;跨境電商行業風起云涌&#xff0c;其中TEMU作為新興力量&#xff0c;其市場表現備受關注。那么&#xff0c;TEMU電商現在的行情究竟如何?對于賣家而言&#xff0c;是否仍然是一個能夠賺錢的平臺呢? 首先&#xff0c;從市場趨勢來看 TEMU電商正處于一個快速…

如何設計學術會議海報?

在參加學術會議的時候&#xff0c;制作一份會議海報來展示你的研究內容是十分必要的。海報是你與別人交流研究成果時的關鍵部分&#xff0c;也是成功科研生涯的重要元素。海報本身自帶許多優秀的特質&#xff1a;思路清晰、內容精練&#xff0c;并且極易引起他人的興趣。 一、…

vant添加列表, 日期選擇總是填充到最后一個組內原因

添加多個行程, 無論在哪個行程上修改時間, 時間總是只顯示在最后一個行程里 錯誤代碼: <div class"journey"><divv-for"(item, index) in ruleform.hrms_business_item":key"index"><div class"journey-title">&l…

Python執行MYSQL SQL文件

很多情況下我們需要Python來執行SQL文件&#xff0c;但是一般庫沒有提供這些功能&#xff0c;直接執行經常會出錯&#xff0c;這里分析各種情況下執行SQL語句的處理。如果你沒有時間的話&#xff0c;直接跳轉查看[第三點](#3. 包含DELIMITER的語句)。 準備工作 這里采用**mys…

Linux之函數應用實例--加法器

一、創建一個對2個整數求和的加法器 首先&#xff0c;定義了一個名為 adder 的 Bash 函數&#xff0c;該函數接受兩個參數 $1 和 $2 并輸出它們的和。 function adder { echo $[ $1$2 ] } 注意&#xff1a; function 關鍵字是可選的。在 Bash 中&#xff0c;可以簡單地使…