TypeScript基礎(chǔ)語(yǔ)法 - interface 接口(二)

TypeScript 中的 interface 接口
  • Interface接口初步了解

現(xiàn)在我們要作一個(gè)簡(jiǎn)歷的自動(dòng)篩選程序,

const screenResume = (name: string, age: number, height: number) => {
  age < 60 && height >= 160 && console.log(name + "進(jìn)入面試");
};

screenResume("張三", 18, 180);

這時(shí)候老板又增加了需求,說(shuō)我必須能看到這些簡(jiǎn)歷。于是你又寫(xiě)了這樣一個(gè)方法。

const getResume = (name: string, age: number, height: number) => {
  console.log(name + "年齡是:" + age);
  console.log(name + "身高是:" + height);
};
getResume("張三", 18, 180);

這時(shí)候問(wèn)題來(lái)了,程序開(kāi)發(fā)中一直強(qiáng)調(diào)“代碼重用”,兩個(gè)方法用的類(lèi)型注解一樣,需要作個(gè)統(tǒng)一的約束。上節(jié)課一個(gè)類(lèi)型別名的知識(shí)可以解決代碼重復(fù)的問(wèn)題,這節(jié)課我們就用一個(gè)更常用的語(yǔ)法接口(Interface).

我們可以把這兩個(gè)重復(fù)的類(lèi)型注解,定義成統(tǒng)一的接口。代碼如下:

interface Girl {
  name: string;
  age: number;
  height: number;
}

有了接口后,我們的程序也要作一些修改,需要寫(xiě)成下面的樣子。這樣就更像是面向?qū)ο缶幊塘恕?/p>

const screenResume = (girl: Girl) => {
  girl.age < 60 && girl.height >= 160 && console.log(girl.name + "進(jìn)入面試");
};

const getResume = (girl: Girl) => {
  console.log(girl.name + "年齡是:" + girl.age);
  console.log(girl.name + "身高是:" + girl.height);
};
const girl = {
  name: "大張三",
  age: 18,
  height: 170,
};

screenResume(girl);
getResume(girl);
  • 接口和類(lèi)型別名的區(qū)別

現(xiàn)在我們學(xué)了接口,也學(xué)過(guò)了類(lèi)型別名,這兩個(gè)語(yǔ)法和用處好像一樣,

類(lèi)型別名可以直接給類(lèi)型,比如string,而接口必須代表對(duì)象。

比如我們的類(lèi)型別名可以寫(xiě)出下面的代碼:

type Girl1 = stirng;

但是接口就不能這樣寫(xiě),它必須代表的是一個(gè)對(duì)象,也就是說(shuō),你初始化girl的時(shí)候,必須寫(xiě)出下面的形式.

const girl = {
  name: "張三",
  age: 18,
  height: 180,
};
  • 接口非必選值得定義

這時(shí)候老板又有了新的要求,要求盡量能看到體重,但是不作強(qiáng)制要求,就是可選值嗎。那接口如何定義那?其實(shí)typeScript已經(jīng)為我們準(zhǔn)備好了相應(yīng)的辦法,就是在:號(hào)前加一個(gè)?

interface Girl {
  name: string;
  age: number;
  height: number;
  weight?: number;
}

然后我們?cè)傩薷囊幌?code>getResume方法,寫(xiě)成這樣。

const getResume = (girl: Girl) => {
  console.log(girl.name + "年齡是:" + girl.age);
  console.log(girl.name + "身高是:" + girl.height);
  girl.weight && console.log(girl.name + "體重是:" + girl.weight);
};
  • 允許加入任意值
    簡(jiǎn)歷一般是有自由發(fā)揮的空間的,所以這時(shí)候需要一些任意值,就是自己愿意寫(xiě)什么就寫(xiě)什么。這時(shí)候interface接口也是支持的。
interface Girl {
  name: string;
  age: number;
  height: number;
  weight?: number;
  [propname: string]: any;
}

這個(gè)的意思是,屬性的名字是字符串類(lèi)型,屬性的值可以是任何類(lèi)型。

這時(shí)候我們?cè)趯?duì)象里給一個(gè)性別,代碼如下:

const girl = {
  name: "張三",
  age: 18,
  height: 170,
  weight: 50,
  sex: "女",
};

再修改一下代碼,這首就沒(méi)有錯(cuò)誤了。

const getResume = (girl: Girl) => {
  console.log(girl.name + "年齡是:" + girl.age);
  console.log(girl.name + "身高是:" + girl.height);
  girl.weight && console.log(girl.name + "體重是:" + girl.weight);
  girl.sex && console.log(girl.name + "性別是:" + girl.sex);
};

這時(shí)候我們的程序是不報(bào)錯(cuò)的,但是如果我們?nèi)サ魟偛诺脑O(shè)置,就會(huì)報(bào)錯(cuò)。

[propname:string]:any;  //去掉

  • 接口里的方法

接口里不僅可以存屬性,還可以存方法,比如這時(shí)候有個(gè)say()方法,返回值是string類(lèi)型。這時(shí)候你就不要再想成簡(jiǎn)歷了,你需要更面向?qū)ο蠡木幊?,想象成一個(gè)人。

interface Girl {
  name: string;
  age: number;
  height: number;
  weight?: number;
  [propname: string]: any;
  say(): string;
}

加上這個(gè)say()方法后,程序馬上就會(huì)報(bào)錯(cuò),因?yàn)槲覀儗?duì)象里沒(méi)有 say方法。那我們就要給對(duì)象一個(gè) say 方法

const girl = {
  name: "張三",
  age: 18,
  height: 170,
  weight: 50,
  sex: "女",
  say() {
    return "hello??!";
  },
};
  • 接口和類(lèi)的約束

我們都知道 JavaScriptES6里是有類(lèi)這個(gè)概念的,類(lèi)可以和接口很好的結(jié)合,我們先來(lái)看一個(gè)例子。下面的

class XiaoJieJie implements Girl {}

這時(shí)候類(lèi)會(huì)直接報(bào)錯(cuò),所以我們需要把這個(gè)類(lèi)寫(xiě)的完全點(diǎn)。

class XiaoJieJie implements Girl {
  name = "張三";
  age = 18;
  height = 170;
  say() {
    return "hello!!";
  }
}
  • 接口間的繼承
    接口也可以用于繼承的,比如你新寫(xiě)一個(gè)Teacher接口,繼承于Person接口。
interface Teacher extends Girl {
  teach(): string;
}

比如這時(shí)候老板說(shuō)了,只看 Teacher 級(jí)別的簡(jiǎn)歷,那我們需要修改getResume()方法。

const getResume = (girl: Teacher) => {
  console.log(girl.name + "年齡是:" + girl.age);
  console.log(girl.name + "身高是:" + girl.height);
  girl.weight && console.log(girl.name + "體重是:" + girl.weight);
  girl.sex && console.log(girl.name + "性別是:" + girl.sex);
};

修改后,你就會(huì)發(fā)現(xiàn)下面我們調(diào)用getResume()方法的地方報(bào)錯(cuò)了,因?yàn)檫@時(shí)候傳的值必須有Teach方法,修改girle對(duì)象,增加teach()方法,這時(shí)候就不會(huì)報(bào)錯(cuò)了。

const girl = {
  name: "zhangsan",
  age: 18,
  height: number;
  weight?: number;
  sex: "女",
  say() {
    return "hello??!";
  },
  teach() {
    return "hello";
  },
};
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容