TypeScript交叉類型的用法及使用場(chǎng)景
交叉類型的意義是讓一個(gè)類型擁有多個(gè)類型的特征。這個(gè)特性特別適用于當(dāng)你需要將多個(gè)不同的類型組合成一個(gè)更復(fù)雜的類型時(shí)。
1. 基本的交叉類型
1.1 語法
交叉類型的語法非常簡(jiǎn)單,使用 & 符號(hào)將多個(gè)類型組合在一起。例如:
type Person = {
name: string;
age: number;
};
type Address = {
street: string;
city: string;
};
type PersonWithAddress = Person & Address;
const personWithAddress: PersonWithAddress = {
name: "Alice",
age: 30,
street: "123 Main St",
city: "Wonderland"
};
console.log(personWithAddress);
在上面的例子中,PersonWithAddress 是一個(gè)交叉類型,它將 Person 和 Address 類型組合成一個(gè)新的類型。這個(gè)新的類型需要同時(shí)包含 Person 類型的 name 和 age 屬性,還需要包含 Address 類型的 street 和 city 屬性。
1.2 交叉類型的特點(diǎn)
- 所有屬性都必須存在:交叉類型會(huì)合并所有參與的類型,所以最終的類型需要擁有所有字段。換句話說,交叉類型是“并集”的概念,但更嚴(yán)格地要求所有類型的成員都存在。
- 如果有同名屬性,則要求類型一致:如果兩個(gè)類型有相同的屬性,交叉類型要求這些屬性具有相同的類型。
例如:
type A = { x: number };
type B = { x: number; y: string };
type C = A & B; // 合并類型
const obj: C = { x: 1, y: "Hello" }; // 合法
如果 A 和 B 類型中的 x 有不同的類型,編譯時(shí)會(huì)報(bào)錯(cuò)。
type A = { x: number };
type B = { x: string }; // 類型沖突
type C = A & B; // 錯(cuò)誤:類型 "number" 與 "string" 不兼容
const obj: C = { x: "Hello" }; // 錯(cuò)誤
2. 使用交叉類型的場(chǎng)景
2.1 混合多個(gè)接口
交叉類型非常適合合并多個(gè)接口,生成一個(gè)包含所有屬性的對(duì)象。
interface Car {
brand: string;
speed: number;
}
interface Features {
hasAirbags: boolean;
isElectric: boolean;
}
type ElectricCar = Car & Features;
const tesla: ElectricCar = {
brand: "Tesla",
speed: 120,
hasAirbags: true,
isElectric: true
};
在這個(gè)例子中,ElectricCar 類型是 Car 和 Features 的交叉類型,包含了所有這兩個(gè)接口的屬性。
2.2 混合函數(shù)類型
交叉類型還可以用于合并函數(shù)類型。你可以將多個(gè)函數(shù)類型合并為一個(gè)類型,這樣該函數(shù)既能執(zhí)行某些操作,也能返回其他類型的值。
type Greet = (name: string) => string;
type Age = (age: number) => number;
type GreetAndAge = Greet & Age;
const greetAndAge: GreetAndAge = (input: any) => {
if (typeof input === "string") {
return `Hello, ${input}`;
} else if (typeof input === "number") {
return input + 1;
}
};
console.log(greetAndAge("Alice")); // 輸出: Hello, Alice
console.log(greetAndAge(25)); // 輸出: 26
在這個(gè)例子中,GreetAndAge 是一個(gè)交叉類型,既包含了 Greet 類型(接收一個(gè) string 類型的參數(shù)并返回一個(gè) string)又包含了 Age 類型(接收一個(gè) number 類型的參數(shù)并返回一個(gè) number)。
2.3 用于聯(lián)合類型的擴(kuò)展
交叉類型也可以和聯(lián)合類型配合使用,用于擴(kuò)展現(xiàn)有的類型。例如,假設(shè)你有一個(gè)基礎(chǔ)類型和多個(gè)變體,你可以通過交叉類型將它們結(jié)合起來。
type Shape = { color: string };
type Circle = Shape & { radius: number };
type Square = Shape & { sideLength: number };
const circle: Circle = { color: "red", radius: 10 };
const square: Square = { color: "blue", sideLength: 5 };
通過交叉類型,可以將基礎(chǔ) Shape 類型與 Circle 或 Square 類型結(jié)合,確保每個(gè)形狀都擁有 color 屬性和各自特定的屬性。
3. 交叉類型與聯(lián)合類型的對(duì)比
交叉類型與聯(lián)合類型非常相似,但它們有根本的不同:
- 交叉類型 (
&):要求同時(shí)具備多個(gè)類型的所有屬性,即合并所有類型的特征。 - 聯(lián)合類型 (
|):要求符合多個(gè)類型中的至少一個(gè),代表多個(gè)可能的類型選擇。
3.1 交叉類型
type A = { name: string };
type B = { age: number };
type C = A & B; // 需要同時(shí)具備 A 和 B 的屬性
const person: C = { name: "Alice", age: 30 };
3.2 聯(lián)合類型
type A = { name: string };
type B = { age: number };
type C = A | B; // 只需要滿足 A 或 B 中的一個(gè)類型
const person1: C = { name: "Alice" }; // 合法
const person2: C = { age: 30 }; // 合法
3.3 總結(jié)
- 交叉類型:所有參與的類型的成員都必須出現(xiàn)在最終類型中。
- 聯(lián)合類型:類型可以是多個(gè)類型中的一個(gè)。
4. 使用交叉類型的高級(jí)應(yīng)用
4.1 在函數(shù)返回值中使用交叉類型
交叉類型還可以應(yīng)用于函數(shù)的返回值,使得函數(shù)可以返回多個(gè)類型的組合結(jié)果。
function createPerson(name: string, age: number): Person & Address {
return {
name,
age,
street: "123 Main St",
city: "Wonderland"
};
}
const personWithAddress = createPerson("Alice", 30);
console.log(personWithAddress.name); // Alice
console.log(personWithAddress.street); // 123 Main St
4.2 交叉類型與泛型
交叉類型與泛型結(jié)合使用時(shí)非常有用,允許你靈活組合多個(gè)類型,同時(shí)提供類型安全。
function merge<T, U>(a: T, b: U): T & U {
return { ...a, ...b };
}
const merged = merge({ name: "Alice" }, { age: 30 });
console.log(merged); // 輸出: { name: "Alice", age: 30 }
在這個(gè)例子中,merge 函數(shù)返回的是 T 和 U 的交叉類型,意味著返回的對(duì)象將同時(shí)具有兩個(gè)類型的屬性。
到此這篇關(guān)于TypeScript交叉類型的用法及使用場(chǎng)景的文章就介紹到這了,更多相關(guān)TypeScript交叉類型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
記一次webpack3升級(jí)webpack4的踩坑經(jīng)歷
這篇文章主要介紹了記一次webpack3升級(jí)webpack4的踩坑經(jīng)歷,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-06-06
JavaScript判斷是否為數(shù)組的3種方法及效率比較
這篇文章主要介紹了JavaScript判斷是否為數(shù)組的3種方法及效率比較,本文直接給出運(yùn)行效果和實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-04-04
前端實(shí)現(xiàn)文件下載的4種常見方式與實(shí)戰(zhàn)示例
在前端開發(fā)中,實(shí)現(xiàn)文件下載是一個(gè)非常常見的需求,本篇文章將介紹 4 種前端文件下載的方式,并提供詳細(xì)示例,希望能幫助大家掌握文件下載的各種技巧2025-04-04
微信小程序?qū)崿F(xiàn)列表的橫向滑動(dòng)方式
這篇文章主要介紹了微信小程序?qū)崿F(xiàn)列表的橫向滑動(dòng),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07
JS 日期驗(yàn)證正則附asp日期格式化函數(shù)
JS 日期驗(yàn)證正則 asp日期格式化函數(shù),大家以后的日期就是能通過驗(yàn)證的了。2009-09-09
javascript仿京東導(dǎo)航左側(cè)分類導(dǎo)航下拉菜單效果
這篇文章主要為大家詳細(xì)介紹了javascript仿京東導(dǎo)航左側(cè)分類導(dǎo)航下拉菜單效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-03-03
JavaScript前端實(shí)現(xiàn)快照的示例代碼
snapshot 翻譯為快照,用于直觀獲取頁面在某個(gè)運(yùn)行時(shí)的狀態(tài),本文主要為大家詳細(xì)介紹 snapshot 工具實(shí)現(xiàn)的原理,以及其在項(xiàng)目中的使用,需要的可以參考下2023-11-11

