解决什么问题?

通用类型进行抽象
在面向对象语言中,接口是一个很重要的概念,它是对行为的抽象,而具体如何行动需要由类去实现。
TypeScript 中的接口是一个非常灵活的概念,除了可用于对类的一部分行为进行抽象以外,也常用于对「对象的形状(Shape)」进行描述。

  1. interface Person {
  2. name: string;
  3. }
  4. function getPersonName (person: Person): void => {
  5. console.log(person.name)
  6. }
  7. function setPersonName (person: Person, name: string): void => {
  8. person.name = name;
  9. }

使用场景

通常情况, 可以类型推断。
工具: quicktype

  1. 参数类型
  2. API 放回类型约束

    属性

    只读属性 (readonly修饰符)

    1. readonly name: string;

可选属性

  1. age?: number;

可索引属性

  1. [index: number]: string;
  2. [propName: string]: string

函数类型

  1. (source: string, searchStr: string): boolean;

接口继承

  1. interface Person {
  2. name: string
  3. }
  4. interface Teacher extends Person {
  5. teachingAge: number
  6. }
  7. interface Student extends Person {
  8. age: number
  9. }
  10. interface Driver {
  11. name: string;
  12. age: number;
  13. }
  14. const teacher = {
  15. name: 'Jack',
  16. teachingAge: 10
  17. }
  18. const student = {
  19. name: 'Lee',
  20. age: 17
  21. }
  22. const getUserInfo = (user: Person) => {
  23. console.log(user.name);
  24. }
  25. getUserInfo(teacher);
  26. getUserInfo(student);
  27. // Jack
  28. // Lee

🌰

  1. interface Person {
  2. readonly name: string, // 只能读不能写
  3. age?: Number, // 属性可有可无
  4. [propName: string]: any, // 属性不确定
  5. say(): string // 方法, 并标注返回类型
  6. }
  7. class User implments Person {
  8. name = 'Jack',
  9. say() {
  10. return 'hello'
  11. }
  12. }

interface VS type VS class VS 抽象类 VS 虚拟类

interface 仅可代表对象

  1. type Person = string;
  2. interface Person = {}


接口

  1. interface A {
  2. <T>(age: T): void;
  3. }
  4. type B = <T>(age: T) => number;
  5. // 实现
  6. let getData1: A = <T>(age: T): void => {
  7. console.log(age);
  8. }

实现

  1. getData1(23);
  2. getData1('hello');
  3. getData1<string>('hello');
  4. // 23
  5. // hello
  6. // hello
  7. let getData2: B = <T>(age: T): number => {
  8. // return age as unknown as number;
  9. return <number>(age as unknown);
  10. }
  11. console.log(getData2(23));
  12. console.log(getData2('hello'));
  13. console.log(getData2<string>('hello'));
  14. // 23
  15. // hello
  16. // hello