美文网首页
TypeScript(三):Interface 接口

TypeScript(三):Interface 接口

作者: 林ze宏 | 来源:发表于2021-05-06 21:02 被阅读0次

1 Interface 接口

  • 对对像的形状(shape)进行描述
  • 对类(class)进行抽象
  • Duck Typing(鸭子类型)

接口名称一般的规范首字母为I大写,这个是约定,如下:

interface IPerson {
  name: string;
  age: number;
}

let viking: IPerson = {
  name: 'viking',
  age:1
}

可选属性:

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

let viking: IPerson = {
  name: 'viking',
}

只读属性:

interface Person {
  readonly id: number;
  name: string;
  age?: number;
}

let viking: Person = {
  id: 1234,
  name: 'viking',
}

注意:readonly 和 cosnt 区别为,readonly 是用在属性上面,而 cosnt 是用在变量上的。

  • 字面量和变量赋值注意事项:
interface IPerson {
  // readonly name: string;
  name: string;
  age: number;
  sex?: string;
  say(): void; // 方法
  write(w: string): string; // 方法
  // [propName: string]: any; // 可选类型,必须指定 propName 类型
}

function setPerson(person: IPerson, name: string): void {
  person.name = name;
}

const person = {
  name: 'xiaoli',
  age: 11,
  say(){},
  write(w: string){
    return w;
  },
  hi(){}, // 多出来的方法
  year: 2011, // 多出来的属性
}

// 通过变量赋值,TS 不会强校验,只有满足 IPerson 中,该有的属性即可
setPerson(person, 'xiaoming');

// 通过字面量赋值,则 TS 会强校验,多出来的属性就会报错,要求接口也需要定义
setPerson({
  name: 'xiaoli',
  age: 11,
  say(){},
  write(w){
    return '';
  },
  year: 2011, // 报错!!!
  hi(){}, // 报错!!!

}, 'xiaoming');

// 通过变量赋值,TS 不会强校验,只有满足 IPerson 中,该有的属性即可
let viking: IPerson = person;

// 通过字面量赋值,则 TS 会强校验,多出来的属性就会报错,要求接口也需要定义
let viking2: IPerson = {
  name: 'viking',
  age: 1,
  say(){
    console.log('..')
  },
  write(word){
    return word;
  },
  year: 2011, // 报错!!!
}

上面示例方法说明,通过变量赋值,TS 不会强校验,只有满足接口 IPerson 中,该有的属性即可,多出来属性也不会报错;如果直接通过字面量赋值,则 TS 会强校验,多出来的属性就会报错,要求接口也需要

  • 接口和类型别名的区别:
    接口和类型别名基本一样,但是,也有一些不同,类型别名可以定义基础类型,而借口只能是对象类型,一般,我们约定可以使用接口,就不要使用类型了:
type tUser = string; // 可以定义基础数据类型
// interface IUser = string; // 接口,不能定义基础数据类型,语法直接报错


type tUser1 = {
  name: string;
}

interface IUser {
  name: string;
}

2 接口和类

  • 类通过 implements 实现相关的接口
interface Radio {
  switchRadio(): void;
}

class Car implements Radio{
  switchRadio() { }
}

class Cellphone implements Radio {
  switchRadio() { }
}
  • 实现多个接口
interface Radio {
  switchRadio(): void;
}

interface Battery {
  checkBatteryStatus();
}

class Cellphone implements Radio, Battery {
  switchRadio() { }
  checkBatteryStatus() { }
}
  • 接口继承其他接口,拥有整合其他接口
interface Radio {
  switchRadio(): void;
}

// 接口继承 Radio,拥有 Radio 接口方法
interface RadioWithBattery extends Radio {
  checkBatteryStatus();
}

class Cellphone implements RadioWithBattery {
  switchRadio() { }
  checkBatteryStatus() { }
}

相关文章

网友评论

      本文标题:TypeScript(三):Interface 接口

      本文链接:https://www.haomeiwen.com/subject/adwirltx.html