[TS手冊學習] 04_對象類型

来源:https://www.cnblogs.com/feixianxing/archive/2023/11/30/typescript-handbook-object-type-optional-readonly-index-signatures-extends-intersection-generic.html
-Advertisement-
Play Games

對象類型通常使用interface聲明,可以設置屬性為可選的或者只讀的,可以設置索引簽名。從簡單類型生成複雜類型可以使用類型繼承或者交集類型。提高類型的泛用性可以使用泛型。 ...


TS官方手冊:TypeScript: Handbook - The TypeScript Handbook (typescriptlang.org)

匿名與具名

對象類型的聲明可以是匿名的,也可以使用interfacetype進行具名聲明。

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;
}

可選屬性 optional

使用?標記:

interface PaintOptions {
  shape: Shape;
  xPos?: number;
  yPos?: number;
}

註:使用PaintOptions聲明的對象,它的xPos屬性會被初步推斷為number | undefined類型。

可以使用條件語句或者解構+預設值的方式收束類型,排除undefined的情況:

function paintShape(opts: PaintOptions) {
    let xPos = opts.xPos === undefined ? 0 : opts.xPos;
    // xPos 的類型為number
}
function paintShape({ shape, xPos = 0, yPos = 0 }: PaintOptions) {
	// xPos 的類型為number,因為undefined會被預設值0取代
    console.log("x coordinate at", xPos);
}

只讀屬性 readonly

interface SomeType {
    readonly prop: string;
}

註:如果有一個屬性的值是引用值,例如一個對象或數組,且這個屬性被標記為只讀(readonly),我們不能修改它的引用值,但是可以修改它的內部屬性。

interface Home {
  readonly resident: { name: string; age: number };
}

function visitForBirthday(home: Home) {
  // 我們可以讀取並且更新'home.resident'里的屬性
  console.log(`Happy birthday ${home.resident.name}!`);
  home.resident.age++;
}
 
function evict(home: Home) {
  // 但我們不能更新'home.resident'本身
  home.resident = {
Cannot assign to 'resident' because it is a read-only property.
    name: "Victor the Evictor",
    age: 42,
  };
}

索引簽名 index signatures

interface StringArray {
  [index: number]: string;
}
 
const myArray: StringArray = getStringArray();
const secondItem = myArray[1];

索引的類型只能是:stringnumbersymbol,以及與這些類型相關的聯合類型。

通常只會考慮stringnumber類型的索引。

:可以同時支持stringnumber兩種類型的索引器,但數字索引器返回的類型必須是字元串索引器返回類型的子類型。這是因為當使用數字進行索引時,JS 實際上會在索引到對象之前將其轉換為字元串。於是使用100"100"進行索引的結果是一樣的。

當指定string類型索引的類型為S後,所有屬性的類型都需要是S的子集。

interface NumberDictionary {
    [index: string]: number;

    length: number; // ok
    name: string; // NOT ok
}

這是因為當我們訪問obj.a的時候,其實也是在訪問obj["a"]

在上面這個例子中,string類型索引被聲明為number類型,這意味著這個對象的所有屬性都是number類型,而下方name卻被聲明為string類型,矛盾了。

可以使用聯合類型解決這個問題:

interface NumberDictionary {
    [index: string]: number | string;

    length: number; // ok
    name: string; // ok
}

同時,索引簽名也可以設置為只讀:

interface ReadonlyStringArray {
  readonly [index: number]: string;
}

類型繼承

使用extends,支持多繼承:

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

交集類型 intersection types

使用&運算符獲取已知的兩個類型的交集。

interface Colorful {
  color: string;
}
interface Circle {
  radius: number;
}
 
type ColorfulCircle = Colorful & Circle;

將兩個基本數據類型取交集會得到never

類型繼承 VS 交集類型

二者都可以產生更複雜的類型。

前者是在原有的類型的基礎上添加可能未有的屬性形成新屬性,而後者將已有的類型進行組合。

泛型對象類型 Generic Object Types

interface Box<Type> {
  contents: Type;
}

let box: Box<string>;

也可以與泛型函數結合使用:

function setContents<Type>(box: Box<Type>, newContents: Type) {
  box.contents = newContents;
}

除了使用interface,也可以使用type別名定義泛型類型。interface一般用來聲明對象類型,而type更靈活,可以組合多種類型:

type OrNull<Type> = Type | null;
type OneOrMany<Type> = Type | Type[];

// type OneOrManyOrNull<Type> = OneOrMany<Type> | null
type OneOrManyOrNull<Type> = OrNull<OneOrMany<Type>>;

// type OneOrManyOrNullStrings = OneOrMany<string> | null
type OneOrManyOrNullStrings = OneOrManyOrNull<string>;

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 通過包管理器安裝 MySQL ubuntu安裝 MySQL 1、配置APT源 ubuntu自己的APT源裡面就有MySQL,以ubuntu2004為例,可以直接用相關源就行了,也可以導入MySQL的官方源。 阿裡雲鏡像源地址:https://developer.aliyun.com/mirror/ ...
  • 在Linux伺服器上查詢進程,有以下幾種方法: 使用ps命令。這個命令用於報告當前系統的進程狀態。可以用以下方式使用ps命令來查看進程信息: ps aux:顯示系統中所有進程的信息。 ps -e:顯示所有進程的信息。 ps -f:顯示進程的所有信息。 ps -l:以長格式顯示進程信息。 ps -r: ...
  • SQL SELECT INTO 語句 SELECT INTO 語句將數據從一個表複製到一個新表中。 SELECT INTO 語法 將所有列複製到新表中: SELECT * INTO newtable [IN externaldb] FROM oldtable WHERE condition; 只複製 ...
  • 本文分享自華為雲社區《GaussDB(DWS)性能調優:常量標量子查詢做全連接導致整體慢》,作者: Zawami 。 問題描述 由於SQL中存在標量子查詢同另一查詢做笛卡爾積使SQL整體慢。標量子查詢,即結果集只有一行一列的子查詢。這裡導致的SQL語句執行慢不只是在於做笛卡爾積慢,也會使後續聚合更慢 ...
  • MySQL Shell如何接管手動搭建(含仲裁節點)MGR集群 本文源自GreatSQL社區用戶的一次提問: Q:一個包含仲裁節點(ARBITRATOR)的GreatSQL MGR集群,一開始是用手動方式構建,後來想用MySQL Shell接管,可以嗎? A:是可以的,不過也有一定局限性 具體的操作 ...
  • 優化器的作用是優化查詢語句的執行效率,它通過評估不同的執行計劃並選擇最優的執行計劃來實現這一目標。 CBO: 一種基於成本的優化器,它通過評估不同查詢執行計劃的成本來選擇最優的執行計劃。CBO會根據資料庫系統定義的統計信息以及其他因素,對不同的執行計划進行評估,並選擇成本最低的執行計劃。CBO的目標 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 前言 上家公司有個需求是批量導出學生的二維碼,我一想這簡單啊,不就是先批量獲取學生數據,然後根據QRcode生成二維碼,然後在用html2canvas導出成圖片嘛。 由於公司工具庫有現成的生成壓縮包方法,我只需要獲得對應的圖片blob就可 ...
  • 【whistle 官網】http://wproxy.org/whistle/install.html 【用途】 抓包、mock、修改返回數據、修改響應頭欄位、延遲模擬弱網等 代理轉發 - 需要配置代理轉發規則 把某環境僅前端資源的請求代理轉發到本地 把某個介面地址的請求代理轉發到指定的後端環境地址 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...