TypeScript入门:四分钟学会接口

99 阅读3分钟

大家好,我是前端理想哥,今天是我们 TS 学习的第2课,本节视频我们来讲下TS中的一个重要知识点:接口

接口的最简单理解就是:TypeScript 通过“鸭式辨型法”来检查一个值的结构,确保它符合预期。听起来是不是有点抽象?别担心,我们来看一段代码,马上就能明白了!

interface LabelInfo {
  label: string;
}

function getLabel(labelInfo: LabelInfo) {
  // 这里会有一些操作
}

const myLabel = {
  size: 5,
  label: 'get 5 object',
}

getLabel(myLabel);

这里的 LabelInfo 就像是一个契约,它告诉 getLabel 函数:“嘿,你传入的 labelInfo 对象,必须有一个 label 属性,并且它的类型得是 string。” 看起来是没错的吧?

但你可能会问了:LabelInfo 接口里明明没有 size 属性,为什么我传了个有 size 属性的对象也能通过呢?🤔

这就是 TypeScript鸭子类型(Duck Typing)原理:只要一个对象符合接口要求的属性,它就认为这个对象实现了接口。就算 myLabel 多了 size 属性,只要它有 label 属性,TypeScript 就认为它合法!是不是很灵活?👌

那如果接口中某些属性不一定存在怎么办呢?这时我们可以使用可选属性!用法简单得很,只需要在属性名后加个问号 ?。

interface LabelInfo {
  label: string;
  color?: string;
  age?: number;
}

看到没?color 和 age 后面加了个问号,表示它们是可选的,也就是说,这些属性可能有,也可能没有。这样做的好处是什么呢?

  1. 提前定义可能存在的属性,让代码更清晰。
  2. 访问不存在的属性时会报错,帮助我们避免 BUG!👍

再来看一个非常有用的特性——只读属性。有时候我们不希望某些对象属性被修改,这时我们就可以给属性加上 readonly 修饰符。

interface Point {
  readonly x: number;
  readonly y: number;
}

const p1: Point = {
  x: 10,
  y: 20,
}

p1.x = 5 // error!

看到没?当我们尝试修改 p1.x 时,TypeScript 会直接报错!因为 x 是只读的,不能被改变。是不是觉得 TS 真的很聪明,帮我们省了不少心?😉

说完了对象,我们再来看看接口如何描述函数类型。其实很简单,我们只需要定义函数的参数类型和返回值类型,TypeScript 就会帮我们检查了。

interface SearchParams {
  (source: string, subString: string): boolean;
}

const mySearch: SearchParams = function(source: string, subString: string): boolean {
  return source.search(subString) !== -1;
}

这里,SearchParams 表示的是一个接受两个 string 类型参数,并返回一个 boolean 的函数。然后我们创建了一个 mySearch 函数,它符合 SearchParams 的定义。你会发现,TS 会帮我们自动检查参数类型是否匹配!

而且,参数名其实不是必须一致的,只要位置和类型对就行。例如:

const mySearch: SearchParams = function(sou: string, sub: string): boolean {
  return sou.search(sub) !== -1;
}

参数名可以不同,TS 只会检查类型!这就像找对象时,不要求你叫“张三”或者“李四”,只要你和身份证上的名字一致就行!😂

总结:

今天我们学习了 TypeScript 中的接口,具体包括:

    1. 接口定义对象结构的契约。
    1. 可选属性让我们可以灵活定义有可能存在或不存在的属性。
    1. 只读属性保护了我们的数据不被修改。
    1. 接口还可以描述函数类型,确保函数参数和返回值的类型安全。

大家明白了吗?如果你觉得这些内容有帮助,不要忘记点个赞,关注一下!下次我们将讲解Typescript中的另外一个重要概念-可索引类型!😉