interface

接口用于定义对象的 '轮廓'

interface IPerson {
  firstName: string;
}

function getName(person: IPerson) {
  return person.firstName;
}

const person = {
  firstName: 'James',
  age: 27
}

getName(person); // OK

但是如果我们直接传入一个对象字面量进去,ts就会报错, 因为ts对对象字面量检测更加严格, 对象字面量只能指定已知属性,'age' 没有定义

getName({firstName: 'James', age: 27});

可以通过下面这种方式来解决

interface IPerson {
  firstName: string;
  age?: number;
}

属性站位符

可以通过类似计算属性的方式来声明接口,表示未知属性名,这个属性默认是 可选属性

interface IPerson {
  firstName: string;
  age?: number;
  [propName: string]: any; // 此处有待深入
}

class 实现 接口

在传统的面向对象中,类继承或者说是是实现接口是很常见的, 使用 implements 关键字, 必填属性必须在class中声明

interface IPerson {
  firstName: string;
  age?: number;
  [propName: string]: any;
  greet(name: string): void;
}

class Student implements IPerson {
  firstName: string = 'James';
  greet(name: string) {
    console.log(`hello ${name}`);
  }
}

let p = new Student();

p.greet(p.firstName); // hello James

interface 和 Function type

可以通过接口来指定方法类型接口

interface IMulti {
  (num1: number, num2: number): number;
}

let square:IMulti = function(a: number, b: number) {
  return a * b;
}

接口扩展接口

一个接口可以 extends 另一个接口,也可以对扩展的接口进行override

interface IPerson {
  firstName: string;
  age?: number;
  [propName: string]: any;
  greet(name: string): void;
}

interface IStudent extends IPerson {
  study(gener: string): void;
  age: number; // override 将其变为必填属性
}

你可能感兴趣的:(interface)