您好,登录后才能下订单哦!
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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。