
- TypeScript 基礎
- TypeScript - 首頁
- TypeScript - 路線圖
- TypeScript - 概述
- TypeScript - 環境搭建
- TypeScript - 基本語法
- TypeScript vs. JavaScript
- TypeScript - 特性
- TypeScript - 變數
- TypeScript - let & const
- TypeScript - 運算子
- TypeScript 基本型別
- TypeScript - 型別
- TypeScript - 型別註解
- TypeScript - 型別推斷
- TypeScript - 數字
- TypeScript - 字串
- TypeScript - 布林值
- TypeScript - 陣列
- TypeScript - 元組
- TypeScript - 列舉
- TypeScript - any
- TypeScript - never
- TypeScript - 聯合型別
- TypeScript - 字面量型別
- TypeScript - Symbol
- TypeScript - null vs. undefined
- TypeScript - 類型別名
- TypeScript 控制流
- TypeScript - 決策
- TypeScript - if 語句
- TypeScript - if else 語句
- TypeScript - 巢狀 if 語句
- TypeScript - switch 語句
- TypeScript - 迴圈
- TypeScript - for 迴圈
- TypeScript - while 迴圈
- TypeScript - do while 迴圈
- TypeScript 函式
- TypeScript - 函式
- TypeScript - 函式型別
- TypeScript - 可選引數
- TypeScript - 預設引數
- TypeScript - 匿名函式
- TypeScript - 函式構造器
- TypeScript - rest 引數
- TypeScript - 引數解構
- TypeScript - 箭頭函式
- TypeScript 介面
- TypeScript - 介面
- TypeScript - 擴充套件介面
- TypeScript 類和物件
- TypeScript - 類
- TypeScript - 物件
- TypeScript - 訪問修飾符
- TypeScript - 只讀屬性
- TypeScript - 繼承
- TypeScript - 靜態方法和屬性
- TypeScript - 抽象類
- TypeScript - 訪問器
- TypeScript - 鴨子型別
- TypeScript 高階型別
- TypeScript - 交叉型別
- TypeScript - 型別守衛
- TypeScript - 型別斷言
- TypeScript 型別操作
- TypeScript - 從型別建立型別
- TypeScript - keyof 型別運算子
- TypeScript - typeof 型別運算子
- TypeScript - 索引訪問型別
- TypeScript - 條件型別
- TypeScript - 對映型別
- TypeScript - 模板字面量型別
- TypeScript 泛型
- TypeScript - 泛型
- TypeScript - 泛型約束
- TypeScript - 泛型介面
- TypeScript - 泛型類
- TypeScript 雜項
- TypeScript - 三斜槓指令
- TypeScript - 名稱空間
- TypeScript - 模組
- TypeScript - 環境宣告
- TypeScript - 裝飾器
- TypeScript - 型別相容性
- TypeScript - Date 物件
- TypeScript - 迭代器和生成器
- TypeScript - Mixins
- TypeScript - 實用程式型別
- TypeScript - 裝箱和拆箱
- TypeScript - tsconfig.json
- 從 JavaScript 到 TypeScript
- TypeScript 有用資源
- TypeScript - 快速指南
- TypeScript - 有用資源
- TypeScript - 討論
TypeScript - keyof 型別運算子
在 TypeScript 中,keyof 型別運算子允許您獲取物件的鍵並使用它們執行各種操作。在處理物件及其屬性時,它起著重要作用。
語法
TypeScript 中 keyof 型別運算子的語法如下:
keyof Type
keyof 關鍵字後跟型別的名稱,稱為“Type”。它返回一個聯合型別,其中包含指定型別的所有鍵(屬性名稱)。這允許您動態訪問和操作物件的鍵。
示例
讓我們藉助 TypeScript 中的一些示例來理解 keyof 運算子。
示例 1:訪問物件屬性名稱
keyof 關鍵字幫助我們檢索在物件型別中定義的屬性的名稱。
在此示例中,我們定義了一個名為“Person”的介面,它有兩個屬性:“name”型別為字串,“age”型別為數字。
然後我們使用 keyof 建立一個類型別名“PersonKeys”以從 Person 介面中提取鍵。
最後,我們將值 'name' 分配給名為“keys”的常量,其型別為 PersonKeys,並記錄其值。
interface Person { name: string; age: number; } type PersonKeys = keyof Person; const keys: PersonKeys = 'name'; console.log(keys);
編譯後,它將生成以下 JavaScript 程式碼:
var keys = 'name'; console.log(keys);
輸出
以上程式碼將產生以下輸出:
name
示例:型別安全的屬性訪問
keyof 關鍵字使我們能夠以型別安全的方式訪問物件屬性。
在此示例中,我們定義了一個名為“Car”的介面,其屬性表示汽車的品牌、年份和價格。我們聲明瞭一個名為“getProperty”的泛型函式,它接受兩個引數:“obj”型別為 T,“key”型別為 K,其中 K 擴充套件 keyof T。該函式返回物件中給定鍵對應的值。然後我們建立一個汽車物件,並使用“getProperty”函式檢索汽車的品牌屬性並將其分配給“carBrand”變數。最後,我們記錄“carBrand”的值。
interface Car { brand: string; year: number; price: number; } function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] { return obj[key]; } const car: Car = { brand: 'Toyota', year: 2022, price: 25000, }; const carBrand: string = getProperty(car, 'brand'); console.log(carBrand);
編譯後,它將生成以下 JavaScript 程式碼:
function getProperty(obj, key) { return obj[key]; } var car = { brand: 'Toyota', year: 2022, price: 25000 }; var carBrand = getProperty(car, 'brand'); console.log(carBrand);
輸出
以上程式碼將產生以下輸出:
Toyota
示例 3:對映物件屬性
keyof 關鍵字也可用於將屬性從一個物件對映到另一個物件。在此示例中,我們定義了一個名為“Fruit”的介面,其屬性表示水果的名稱和顏色。然後我們使用對映型別中的 keyof 建立一個新的型別“FruitMapped”。它將 keyof Fruit 中的每個鍵對映到型別“string”。最後,我們使用 FruitMapped 型別建立一個“fruit”物件並記錄其值。
interface Fruit { name: string; color: string; } type FruitMapped = { [K in keyof Fruit]: string; }; const fruit: FruitMapped = { name: 'Apple', color: 'Red', }; console.log(fruit);
編譯後,它將生成以下 JavaScript 程式碼:
var fruit = { name: 'Apple', color: 'Red' }; console.log(fruit);
輸出
以上程式碼將產生以下輸出:
{ name: 'Apple', color: 'Red' }
示例 4:條件型別對映
keyof 關鍵字的另一個強大應用是在條件型別對映中。這允許我們根據某些條件選擇性地對映屬性。在此示例中,我們有一個名為“Product”的介面,它表示產品的名稱、價格和可用性。我們定義了一個型別“DiscountedProducts”,它使用 keyof 利用條件對映。它檢查屬性的值是否擴充套件了“number”型別,並將其對映到原始值和“null”的聯合型別。對於所有其他屬性型別,它保持原始值型別不變。最後,我們使用 DiscountedProducts 型別建立一個“product”物件。
interface Product { name: string; price: number; inStock: boolean; } type DiscountedProducts<T> = { [K in keyof T]: T[K] extends number ? T[K] | null : T[K]; }; const product: DiscountedProducts<Product> = { name: 'Widget', price: 10, inStock: true, }; console.log(product);
編譯後,它將生成以下 JavaScript 程式碼:
var product = { name: 'Widget', price: 10, inStock: true }; console.log(product);
輸出
以上程式碼將產生以下輸出:
{ name: 'Widget', price: 10, inStock: true }