TypeScript-面向对象(接口、类、对象、泛型)
TypeScript 的接口与类学习总结
1. 接口是什么?
接口(interface
)定义了一组抽象方法,即只规定了方法的名称和参数,而不提供实现细节。类可以通过实现接口来定义这些方法的具体实现。
接口是为了定义一种契约,让其他类可以根据这个契约实现特定的功能。TypeScript 的接口不会被编译为 JavaScript,它仅在开发和编译阶段起作用,帮助进行类型检查。
2. 接口的使用
-
接口定义:
interface IPerson {firstName: string;lastName: string;sayHi: () => string; }
这个接口规定了对象
IPerson
必须有firstName
、lastName
属性,并实现一个sayHi
方法。 -
实现接口:
var customer: IPerson = {firstName: "Tom",lastName: "Hanks",sayHi: (): string => { return "Hi there" } }; console.log(customer.sayHi()); // 输出: Hi there
3. 联合类型与接口
接口中的属性可以使用联合类型(多个类型的组合),使得接口更加灵活。例如:
interface RunOptions {program: string;commandline: string[] | string | (() => string);
}
这表示 commandline
属性可以是字符串、字符串数组或一个返回字符串的函数。
4. 接口与数组
接口可以定义数组的索引类型,例如:
interface NameList {[index: number]: string;
}
此接口规定数组的索引是数字,元素必须是字符串。
5. 接口继承
接口可以继承其他接口,甚至多个接口:
- 单接口继承:
interface Person {age: number; }interface Musician extends Person {instrument: string; }
- 多接口继承:
interface IParent1 {v1: number; }interface IParent2 {v2: number; }interface Child extends IParent1, IParent2 {}
6. TypeScript 类
-
类定义与实例化:
class Car {engine: string;constructor(engine: string) {this.engine = engine;}disp(): void {console.log("发动机为: " + this.engine);} }let myCar = new Car("V8"); myCar.disp(); // 输出: 发动机为: V8
-
类的继承:
TypeScript 支持继承(extends
):class Shape {area: number;constructor(a: number) {this.area = a;} }class Circle extends Shape {disp(): void {console.log("圆的面积: " + this.area);} }let myCircle = new Circle(223); myCircle.disp(); // 输出: 圆的面积: 223
-
静态属性与方法:
静态成员可以通过类直接调用:class StaticMem {static num: number;static disp(): void {console.log("num 值为: " + StaticMem.num);} } StaticMem.num = 12; StaticMem.disp(); // 输出: num 值为: 12
7. 泛型
泛型是一种设计模式,允许我们编写可重用、类型安全的代码。它允许函数、类、接口可以处理不同类型的数据。
-
泛型函数:
function identity<T>(arg: T): T {return arg; }let result = identity<string>("Hello"); console.log(result); // 输出: Hello
-
泛型类:
class Box<T> {private value: T;constructor(value: T) {this.value = value;}getValue(): T {return this.value;} }let stringBox = new Box<string>("TypeScript"); console.log(stringBox.getValue()); // 输出: TypeScript
-
泛型约束:
可以通过约束限制泛型的类型:interface Lengthwise {length: number; }function logLength<T extends Lengthwise>(arg: T): void {console.log(arg.length); }logLength("hello"); // 输出: 5
8. 总结:接口与类的区别
- 接口是定义对象的结构,而类则是实现。
- 接口可以被多个类实现,具有更大的灵活性;而类只能继承自另一个类。
- 接口不能直接实例化,它是一个规范;而类可以创建对象。
TypeScript 通过接口、类和泛型等特性,使得代码更加灵活、安全,并且在开发阶段提供强大的类型检查功能。