extends
關鍵字怎么使用extends
關鍵字概述extends
extends
extends
extends
extends
extends
extends
extends
extends
extends
extends
extends
extends
extends
extends
extends
extends
extends
extends
extends
extends
extends
extends
extends
extends
TypeScript 是一種由微軟開發的開源編程語言,它是 JavaScript 的一個超集,添加了可選的靜態類型和基于類的面向對象編程。TypeScript 的設計目標是開發大型應用,并且可以編譯成純 JavaScript,從而在任何瀏覽器、任何計算機和任何操作系統上運行。
在 TypeScript 中,extends
關鍵字是一個非常重要的概念,它在類繼承、接口繼承、泛型約束、條件類型等多個場景中都有廣泛的應用。本文將詳細探討 extends
關鍵字在 TypeScript 中的各種用法,并通過豐富的示例代碼幫助讀者深入理解其工作原理。
extends
關鍵字概述extends
關鍵字在 TypeScript 中主要用于以下幾個方面:
接下來,我們將逐一探討這些用法。
extends
在 TypeScript 中,類繼承是通過 extends
關鍵字實現的。通過繼承,子類可以繼承父類的屬性和方法,并且可以添加新的屬性和方法,或者重寫父類的方法。
class Parent {
name: string;
constructor(name: string) {
this.name = name;
}
greet(): void {
console.log(`Hello, ${this.name}`);
}
}
class Child extends Parent {
age: number;
constructor(name: string, age: number) {
super(name);
this.age = age;
}
greet(): void {
super.greet();
console.log(`I am ${this.age} years old.`);
}
}
const child = new Child("Alice", 10);
child.greet();
Parent
類有一個 name
屬性和一個 greet
方法。Child
類通過 extends
關鍵字繼承了 Parent
類,并添加了一個 age
屬性。Child
類重寫了 greet
方法,并在其中調用了父類的 greet
方法。Hello, Alice
I am 10 years old.
super()
,以初始化父類的屬性。super
關鍵字調用父類的方法。extends
在 TypeScript 中,接口繼承也是通過 extends
關鍵字實現的。通過繼承,子接口可以繼承父接口的屬性和方法,并且可以添加新的屬性和方法。
interface Person {
name: string;
age: number;
}
interface Employee extends Person {
employeeId: number;
}
const employee: Employee = {
name: "Alice",
age: 30,
employeeId: 12345
};
console.log(employee);
Person
接口定義了 name
和 age
屬性。Employee
接口通過 extends
關鍵字繼承了 Person
接口,并添加了一個 employeeId
屬性。employee
對象實現了 Employee
接口,因此必須包含 name
、age
和 employeeId
屬性。{ name: 'Alice', age: 30, employeeId: 12345 }
extends
在 TypeScript 中,泛型約束是通過 extends
關鍵字實現的。通過泛型約束,可以限制泛型參數的類型范圍,從而確保類型安全。
function printLength<T extends { length: number }>(arg: T): void {
console.log(arg.length);
}
printLength("Hello"); // 5
printLength([1, 2, 3]); // 3
printLength({ length: 10 }); // 10
printLength
函數接受一個泛型參數 T
,并且 T
必須滿足 { length: number }
的約束。T
必須是一個具有 length
屬性的對象,且 length
屬性的類型為 number
。printLength
函數可以接受字符串、數組和具有 length
屬性的對象。5
3
10
&
符號進行組合。extends
在 TypeScript 中,條件類型是通過 extends
關鍵字實現的。條件類型允許根據類型關系進行條件判斷,從而生成不同的類型。
type IsString<T> = T extends string ? true : false;
type A = IsString<"hello">; // true
type B = IsString<123>; // false
IsString
是一個條件類型,它接受一個泛型參數 T
。T
是 string
類型的子類型,則 IsString<T>
為 true
,否則為 false
。A
的類型為 true
,因為 "hello"
是 string
類型的子類型。B
的類型為 false
,因為 123
不是 string
類型的子類型。true
false
extends
在 TypeScript 中,extends
關鍵字還可以用于創建高級類型,如聯合類型、交叉類型、映射類型等。
type A = string | number;
function printValue(value: A): void {
console.log(value);
}
printValue("Hello"); // Hello
printValue(123); // 123
A
是一個聯合類型,表示 string
或 number
類型。printValue
函數接受一個 A
類型的參數,因此可以接受 string
或 number
類型的值。Hello
123
type A = { name: string };
type B = { age: number };
type C = A & B;
const person: C = {
name: "Alice",
age: 30
};
console.log(person);
A
和 B
是兩個接口類型。C
是一個交叉類型,表示同時具有 A
和 B
的屬性和方法。person
對象實現了 C
類型,因此必須包含 name
和 age
屬性。{ name: 'Alice', age: 30 }
type Readonly<T> = {
readonly [P in keyof T]: T[P];
};
type Person = {
name: string;
age: number;
};
type ReadonlyPerson = Readonly<Person>;
const person: ReadonlyPerson = {
name: "Alice",
age: 30
};
// person.name = "Bob"; // Error: Cannot assign to 'name' because it is a read-only property.
Readonly
是一個映射類型,它將 T
類型的所有屬性設置為只讀。Person
是一個普通接口類型。ReadonlyPerson
是 Person
的只讀版本,因此 person
對象的屬性不能被修改。{ name: 'Alice', age: 30 }
extends
在 TypeScript 中,extends
關鍵字還可以用于類型推斷,從而根據類型關系推斷出更具體的類型。
type A = string | number;
function printValue<T extends A>(value: T): void {
console.log(value);
}
printValue("Hello"); // Hello
printValue(123); // 123
A
是一個聯合類型,表示 string
或 number
類型。printValue
函數接受一個泛型參數 T
,并且 T
必須滿足 A
的約束。printValue
函數可以接受 string
或 number
類型的值。Hello
123
extends
在 TypeScript 中,extends
關鍵字還可以用于類型保護,從而在運行時判斷變量的類型。
function isString(value: any): value is string {
return typeof value === "string";
}
function printValue(value: string | number): void {
if (isString(value)) {
console.log(`String: ${value}`);
} else {
console.log(`Number: ${value}`);
}
}
printValue("Hello"); // String: Hello
printValue(123); // Number: 123
isString
是一個類型保護函數,它判斷 value
是否為 string
類型。printValue
函數接受一個 string
或 number
類型的參數。printValue
函數中,通過 isString
函數判斷 value
的類型,并根據類型輸出不同的結果。String: Hello
Number: 123
extends
在 TypeScript 中,extends
關鍵字還可以用于類型兼容性判斷,從而判斷一個類型是否是另一個類型的子類型。
type A = string;
type B = string | number;
type C = A extends B ? true : false; // true
A
是 string
類型。B
是 string | number
類型。C
是一個條件類型,它判斷 A
是否是 B
的子類型。string
是 string | number
的子類型,因此 C
的類型為 true
。true
extends
在 TypeScript 中,extends
關鍵字還可以用于類型別名,從而創建更復雜的類型別名。
type A = string;
type B = A extends string ? true : false; // true
A
是 string
類型。B
是一個條件類型,它判斷 A
是否是 string
類型的子類型。A
是 string
類型,因此 B
的類型為 true
。true
extends
在 TypeScript 中,extends
關鍵字還可以用于類型映射,從而創建更復雜的類型映射。
type Readonly<T> = {
readonly [P in keyof T]: T[P];
};
type Person = {
name: string;
age: number;
};
type ReadonlyPerson = Readonly<Person>;
const person: ReadonlyPerson = {
name: "Alice",
age: 30
};
// person.name = "Bob"; // Error: Cannot assign to 'name' because it is a read-only property.
Readonly
是一個映射類型,它將 T
類型的所有屬性設置為只讀。Person
是一個普通接口類型。ReadonlyPerson
是 Person
的只讀版本,因此 person
對象的屬性不能被修改。{ name: 'Alice', age: 30 }
extends
在 TypeScript 中,extends
關鍵字還可以用于類型操作,從而創建更復雜的類型操作。
type A = string;
type B = number;
type C = A extends string ? B extends number ? true : false : false; // true
A
是 string
類型。B
是 number
類型。C
是一個條件類型,它判斷 A
是否是 string
類型的子類型,并且 B
是否是 number
類型的子類型。A
是 string
類型,且 B
是 number
類型,因此 C
的類型為 true
。true
extends
在 TypeScript 中,extends
關鍵字還可以用于類型工具,從而創建更復雜的類型工具。
type A = string;
type B = number;
type C = A extends string ? B extends number ? true : false : false; // true
A
是 string
類型。B
是 number
類型。C
是一個條件類型,它判斷 A
是否是 string
類型的子類型,并且 B
是否是 number
類型的子類型。A
是 string
類型,且 B
是 number
類型,因此 C
的類型為 true
。true
extends
在 TypeScript 中,extends
關鍵字還可以用于類型系統設計,從而創建更復雜的類型系統。
type A = string;
type B = number;
type C = A extends string ? B extends number ? true : false : false; // true
A
是 string
類型。B
是 number
類型。C
是一個條件類型,它判斷 A
是否是 string
類型的子類型,并且 B
是否是 number
類型的子類型。A
是 string
類型,且 B
是 number
類型,因此 C
的類型為 true
。true
extends
在 TypeScript 中,extends
關鍵字還可以用于類型安全,從而確保類型安全。
type A = string;
type B = number;
type C = A extends string ? B extends number ? true : false : false; // true
A
是 string
類型。B
是 `number免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。