網站首頁 編程語言 正文
一、聯(lián)合類型
在TypeScript中,聯(lián)合類型(Union Types)是指用“|”符號將多個類型組合成一個的類型。這種類型可以包含不同的類型,例如字符串、數字或對象。這些不同類型的值可以賦值給聯(lián)合類型的變量。而在使用這個變量時,需要對不同類型的值進行類型檢查,以確定當前變量的類型。
以下是一個簡單的聯(lián)合類型的示例:
let myVar: string | number;
myVar = "hello";
console.log(myVar.length); // 輸出 5
myVar = 123;
console.log(myVar.length); // 報錯,類型“number”上不存在屬性“l(fā)ength”
在這個例子中,myVar 變量的類型是 string | number,可以賦值為一個字符串或者一個數字。
- 當賦值為字符串時,可以調用 length 屬性;
- 當賦值為數字時,就無法調用 length 屬性,會導致編譯報錯。
使用聯(lián)合類型可以增強代碼的靈活性,提高代碼的復用性和可維護性。在實際開發(fā)中,它也經常被用于函數參數的類型聲明、接口中的屬性類型聲明等方面。
二、類型別名
TypeScript中的類型別名是一種非常有用的功能,它可以讓我們給一種類型取一個自定義的名稱。這個名稱可以用來代替這種類型的任何地方,讓代碼更加簡潔易讀。
類型別名使用type
關鍵字來創(chuàng)建,具體的語法如下:
type MyType = string;
這個語法在TypeScript中是很常見的,它把MyType
這個名稱與string
類型綁定在一起?,F(xiàn)在,我們可以用MyType
來代替string
類型了:
let myStr: MyType = "Hello, world";
這里的let
語句聲明了一個變量myStr
,它的類型是MyType
,也就是string
。我們可以看到,MyType
已經被成功地解析成了string
類型。
類型別名也可以用來定義更復雜的類型。例如,我們可以把一個對象類型定義為類型別名:
type Person = {
name: string;
age: number;
};
這里的Person
類型別名代表了一個對象類型,它包含兩個屬性:name
和age
,分別是string
類型和number
類型。現(xiàn)在,我們可以用Person
來定義一個對象:
let john: Person = {
name: "John",
age: 30
};
這里的john
變量的類型就是Person
,它是一個對象,帶有name
和age
兩個屬性。
總之,類型別名是TypeScript中非常實用的功能,在定義復雜類型、簡化代碼等方面都有很大的幫助。
三、接口
TypeScript中的接口是用來定義代碼之間交互的契約。它們可以用于描述對象、函數、類等的結構和規(guī)范。
下面是一些關于TypeScript接口的詳細介紹:
- 對象接口
對象接口是在TypeScript中最常用的接口之一,它用于描述對象的結構。它可以定義對象應該有哪些屬性,它們的類型是什么,以及它們是否是可選的。例如:
interface Person {
name: string;
age: number;
email?: string;
}
const person: Person = {
name: 'John',
age: 25
}
在這個例子中,Person接口定義了一個人的結構,包括一個必填的“name”屬性,一個必填的“age”屬性和一個可選的“email”屬性。然后創(chuàng)建了一個名為“person”的對象,符合這個接口的定義。
- 函數接口
函數接口描述函數的形式參數和返回類型。例如:
interface Add {
(x: number, y: number): number;
}
const add: Add = (x, y) => {
return x + y;
};
在這個例子中,Add接口描述一個返回類型為number的函數,該函數接受兩個參數:x和y,這兩個參數均為number類型。
- 可索引類型接口
可索引類型接口用于描述可以像數組一樣使用的對象。它允許您定義一個對象,該對象通過整數或字符串屬性來訪問其元素。例如:
interface StringArray {
[index: number]: string;
}
const myArray: StringArray = ['Hello', 'World'];
在這個例子中,StringArray接口允許我們通過數字來訪問數組中的元素,因此myArray[0]將返回字符串“Hello”。
- 類接口
類接口描述一個類的實例結構。它可以描述一個類中必須實現(xiàn)的屬性和方法。例如:
interface Animal {
name: string;
eat(food: string): void;
sleep(hours: number): void;
}
class Cat implements Animal {
name = 'Cat';
eat(food: string) {
console.log(`I'm eating ${food}`);
}
sleep(hours: number) {
console.log(`I'm sleeping for ${hours} hours`);
}
}
在這個例子中,Animal接口描述了一個動物實例應該具有的屬性和方法。Cat類實現(xiàn)了這個接口,因此它必須定義name,eat和sleep方法以滿足該接口。
總而言之,TypeScript接口提供了一種描述結構和規(guī)范的方式,從而使代碼更加清晰和易于理解。通過使用接口,開發(fā)人員可以定義約束,使得代碼更加穩(wěn)健、可靠和易于擴展。
四、類型別名和接口的區(qū)別
接口和類型別名的區(qū)別主要在以下幾個方面:
- 可以定義對象的形狀的只能是接口,類型別名不能。
interface Person {
name: string;
age: number;
}
type MyPerson = {
name: string;
age: number;
}
- 類型別名可以定義任意類型的別名,而不僅僅是對象類型。例如:
type MyBoolean = boolean;
type MyFunction = (...args: any[]) => any;
- 類型別名可以定義聯(lián)合類型、交叉類型、元組等復雜類型:
type MyType = string | number;
type MyObj = { a: string } & { b: number };
type MyTuple = [string, number];
- 接口可以定義擴展操作符(…)和可選屬性:
interface Foo {
bar: string;
baz?: number;
[k: string]: any; // 使用擴展操作符
}
- 接口可以定義函數:
interface MyFunc {
(x: number, y: number): number;
}
- 接口可以被多次擴展,類型別名不能被擴展
接口可以被多次擴展,即一個接口可以在定義后被多次擴展,每次擴展都可以添加新的屬性或方法。比如下面的示例:
interface Person {
name: string;
}
interface Person {
age: number;
}
const person: Person = {
name: "Tom",
age: 18,
};
在上面的示例中,定義了一個名為Person
的接口,并且在后面又定義了一個同名的接口。這是完全允許的,因為這兩個接口在類型聲明時是合并的。最終得到的Person
接口將包含name
和age
兩個屬性。
相比之下,類型別名不能被擴展。例如:
type Person = {
name: string;
};
type Person = {
age: number;
};
在上面的示例中,我們嘗試定義了兩個同名的類型別名Person
,但是這會引起編譯錯誤。因為類型別名只能被定義一次。如果我們需要添加新的屬性,就需要重新定義一個新的類型別名,而不是擴展已有的類型別名。
總的來說,接口更適合于描述對象的形狀和方法,而類型別名更適合于為復雜類型定義別名,或定義函數類型、聯(lián)合類型等。
五、類型斷言
TypeScript的類型斷言可以讓開發(fā)者手動指定一個變量的類型,即告訴編譯器當前變量的類型是什么,這個指定的類型可以與變量實際的類型不同。
類型斷言可以在變量名前加上<type>
或者使用as
關鍵字,以下是兩種寫法的示例:
-
<type>variable
let someValue: any = "hello world"; let strLength: number = (<string>someValue).length;
-
variable as type
let someValue: any = "hello world"; let strLength: number = (someValue as string).length;
類型斷言有以下幾個特點:
- 它不會在運行時進行類型檢查或類型轉換,僅僅在編譯時發(fā)揮作用。
- 如果類型斷言的類型與變量實際的類型不同,則會導致編譯錯誤。
- 類型斷言可以應用于任何類型,包括原始類型、對象類型、函數類型等。
原文鏈接:https://blog.csdn.net/jieyucx/article/details/131341689
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2022-07-14 AVX2指令集優(yōu)化整形數組求和算法_C 語言
- 2024-03-28 存儲過程整合springboot
- 2023-01-19 GO語言的控制語句詳解包括GO語言的指針語法_Golang
- 2022-07-10 緩存路由關聯(lián)的兩個生命周期activated和deactivated
- 2022-06-01 ASP.Net?Core中的日志與分布式鏈路追蹤_實用技巧
- 2022-03-14 has been blocked by CORS policy: Response to prefl
- 2022-11-21 Golang?Mutex互斥鎖源碼分析_Golang
- 2022-06-29 tomcat正常啟動但網頁卻無法訪問的幾種解決方法_Tomcat
- 欄目分類
-
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支