为什么将Radio单独定义为借口后,类的内部还需要单独再定义?

来源:2-11 类和接口 - 完美搭档

Roopher

2020-10-10

按照老师所讲的内容,针对多个类中可以定义同一个模型形状的方法可以单独定义一个接口来描述形状。

但是在我的测试中,例如:

interface Radio {
  fn(input: number): void;
}

class Car implements Radio {
  fn(input: number) {}
}

class Phone implements Radio {
  fn(input: number) {}
}

本来我以为单独定义好接口后,可以这么写:

interface Radio {
  fn(input: number): void;
}

class Car implements Radio {
  fn(input) {}
}

class Phone implements Radio {
  fn(input) {}
}

但是发现不行,会提示这个 input 参数为 any。
那么我的问题是:既然方法需要写全各种参数及返回值等数据的类型,为什么还要单独给提成一个独立的接口?这样不麻烦吗?

比如像之前的接口定义:

// 接口定义
interface IFn {
  (x: number, y: number): number
}

// 使用
const fn1: IFn = (x,y)=>{}
const fn2: IFn = (x,y)=>{}
const fn3: IFn = (x,y)=>{}

我觉得上面的这个写法是能理解的。但是类的这个写法有点不太明白,给我得感觉就像:

// 接口定义
interface IFn {
  (x: number, y: number): number
}

// 使用
const fn1: IFn = (x: number, y: number):number => { return x + y}

那这样不费事么?

写回答

1回答

张轩

2020-10-11

同学你好 implements 是 OOP 中的一个概念,称之为实现,这个实现你可以理解为一种约束,interface 在这里像是一个规范,implements 就表示,你的类必须要按照我的 interface 来实现,这样做的意义在于工程化开发 比如跨端开发,使用依赖注入模式的话,顶层API依赖各端适配器,那就可以约定好interface,各端分头implements.这样要重构,要加新功能,新端都是非常容易.便于测试,便于开发. 

0
1
weixin_慕神3292065
老师,这种思想有点像TS中的抽象类啊,就是声明一个抽象类,里面有抽象的属性和方法,然后继承这个抽象类的类必须要有抽象类身上的属性和方法
2020-10-12
共1条回复

Vue3 + TS 仿知乎专栏企业级项目

带你完成前后端分离复杂项目,率先掌握 vue3 造轮子技能

3218 学习 · 2370 问题

查看课程