作用:在面向对象的编程中,接口是一种规范的定义,它定义了行为和动作的规范,在程序设计里面,接口起到一种限制和规范的作用。 接口定义了某一批类所需要遵守的规范,接口不关心这些类的内部状态数据,也不关心这些类里方法的实现细节,它只规定这批类里必须提供某些方法,提供这些方法的类就可以满足实际需要。 它类似于 java ,同时还增加了更加灵活的接口类型,包括属性、函数、可索引和类等。

TypeScript 通过 interface关键字,实现自定义接口

1. 属性接口

  1. // 方式一:直接定义变量,进行约束
  2. function printLabel(labelInfo: { label: string }): void {
  3. console.log()
  4. }
  5. printLabel('张三'); // ×
  6. printLabel({ name: '张三' }); // ×
  7. printLabel({ label: '张三' }); // √
  8. // 方式二:使用接口 interface
  9. interface LabelInfo {
  10. label: string
  11. }
  12. function printLabel(labelInfo: LabelInfo): void {
  13. console.log()
  14. }

接口可以对属性、方法进行批量约束

  1. // 传入对象的约束,也成为属性接口
  2. interface FullName {
  3. firstName: string; // 以分号结束
  4. secondName: string;
  5. age?: number; // 可选属性
  6. }
  7. function printName(name: FullName) {
  8. // 必须传入对象包含 firstName secondNmae
  9. }

2. 函数类型接口

对方法传入的参数以及返回值进行约束

  1. // 方式一:使用普通方式,定义函数的入参出参类型
  2. var md5 = function(key: string, value: string): string {
  3. return key + value;
  4. }
  5. // 方式二:使用接口,定义函数的入参出参类型
  6. interface encrypt {
  7. (key: string, value: string): string;
  8. }
  9. var md5: encrypt = function (key, value) {
  10. return key + value;
  11. }

3. 可索引接口

可索引类型具有一个索引签名,它描述了对象索引的类型,还有相应的索引返回值类型。

通过 number 类型索引,得到 string 类型的返回值

  1. interface StringArray {
  2. [index: number]: string;
  3. }
  4. let myArray: StringArray;
  5. myArray = ["Bob", "Fred"];
  6. let myStr: string = myArray[0];

4. 类类型接口

对类进行约束,与抽象类有点相似。

  1. interface Animal {
  2. name: string;
  3. eat(str: string): void;
  4. }
  5. class Dog implements Animal {
  6. name: string;
  7. constructor(name: string) {
  8. this.name = name;
  9. }
  10. eat(str: string): void {
  11. console.log(this.name + '吃粮食', str)
  12. }
  13. }

5. 接口扩展

  • extends 继承
    • 类和接口都可以使用它
    • InterFaceA exntends InterFaceB
    • InterFaceA extends ClassX
    • ClassA extends ClassB
  • implements 实现
    • 类可以使用
    • ClassA implements InterFaceX
    • ClassA implements ClassB

      实现(implements)是面向对象中的一个重要概念。 一般来讲,一个类只能继承自另一个类,有时候不同类之间可以有一些共有的特性,这时候就可以把特性提取成接口(interfaces),用 implements 关键字来实现。这个特性大大提高了面向对象的灵活性

extends 类/接口的继承

  1. interface GenericInterface<U> {
  2. value: U;
  3. getIdentity: () => U
  4. }
  5. /**
  6. * 相当于
  7. * interface Good<T> {
  8. * value: T;
  9. * getIdentity: () => T
  10. * name: string;
  11. * }
  12. */
  13. interface Good<T> extends GenericInterface<T> {
  14. name: string;
  15. }
  1. class Father {
  2. name: string;
  3. constructor() {
  4. this.name = 'father';
  5. }
  6. run(): void {
  7. console.log('Running')
  8. }
  9. }
  10. /**
  11. * FatherProps 继承了 Father 的 name 属性 和 run 方法
  12. */
  13. interface FatherProps extends Father {
  14. add(a: number, b: number): number
  15. }
  1. class Father {
  2. name: string;
  3. constructor() {
  4. this.name = 'father';
  5. }
  6. run(): void {
  7. console.log('Running')
  8. }
  9. }
  10. class Son extends Father {
  11. say() {
  12. console.log('Saying')
  13. }
  14. }

implement 类的实现

  1. interface IProps {
  2. setState(state: object): void
  3. }
  4. class Son implements IProps {
  5. state: object;
  6. constructor() {
  7. this.state = {}
  8. }
  9. setState(state: object) {
  10. this.state = state
  11. }
  12. }
  1. class Father {
  2. name: string;
  3. constructor() {
  4. this.name = 'father';
  5. }
  6. run(): void {
  7. console.log('Running')
  8. }
  9. }
  10. class Son implements Father {
  11. name: string
  12. constructor() {
  13. this.name = 'son';
  14. }
  15. run(): void {
  16. console.log('Running son')
  17. }
  18. }

综合使用

  1. interface IProps {
  2. setState(state: object): void
  3. }
  4. interface IFatherProps extends IProps {
  5. name: string;
  6. run(): void;
  7. }
  8. interface ISonProps extends IFatherProps {
  9. say(message: string): void
  10. }
  11. class Father implements IFatherProps {
  12. state: object;
  13. name: string;
  14. constructor(name: string) {
  15. this.name = name;
  16. this.state = {}
  17. }
  18. setState(state: object) {
  19. this.state = state;
  20. }
  21. run(): void {
  22. console.log('Running')
  23. }
  24. }
  25. class Son extends Father implements ISonProps {
  26. constructor(name: string) {
  27. super(name);
  28. this.name = name;
  29. }
  30. run(): void {
  31. console.log('Running son')
  32. }
  33. say(message: string) {
  34. console.log(this.name)
  35. }
  36. }