溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

TypeScript怎么定義接口

發(fā)布時(shí)間:2021-07-23 16:56:33 來(lái)源:億速云 閱讀:116 作者:chen 欄目:開發(fā)技術(shù)

這篇文章主要講解了“TypeScript怎么定義接口”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“TypeScript怎么定義接口”吧!

接口的作用:

接口,英文:interface,其作用可以簡(jiǎn)單的理解為:為我們的代碼提供一種約定。

在Typescript中是這么描述的:

  • TypeScript的核心原則之一是對(duì)值所具有的結(jié)構(gòu)進(jìn)行類型檢查。它有時(shí)被稱做“鴨式辨型法”或“結(jié)構(gòu)性子類型化”。

  • 在TypeScript里,接口的作用就是為這些類型命名和為你的代碼或第三方代碼定義契約。

舉個(gè)例子:

// 定義接口 Person
interface Person {
    name: string;
    age: number;
}

// 指定定義的變量 man 的類型為我們的 Person "類型" 【這么表達(dá)不是很準(zhǔn)確,只是為了方便理解】
let man: Person;

// 此時(shí),我們對(duì) man 賦值時(shí),man 就必須遵守我們定義的 Person 約束,即必須存在 number 類型的 age 字段 和 string 類型的 name 字段
man = { age: 10, name: 'syw' }
# 或者這樣
function fun(women:Person){} // 參數(shù) womem 也必須遵守 Person 約束

上面的例子我簡(jiǎn)單說(shuō)了一下如何定義一個(gè)接口和接口的作用,下面我就簡(jiǎn)單的說(shuō)一下接口的其他玩法:

設(shè)置接口可選屬性:

帶有可選屬性的接口與普通的接口定義差不多,只是在可選屬性名字定義的后面加一個(gè) ? 符號(hào)。

interface Person {
    name: string
    age?: number
}

可選屬性,我們最常見的使用情況是,不確定這個(gè)參數(shù)是否會(huì)傳,或者存在。

在Typescript中是這么描述可選參數(shù)的好處的:

  • 可選屬性的好處之一是可以對(duì)可能存在的屬性進(jìn)行預(yù)定義,好處之二是可以捕獲引用了不存在的屬性時(shí)的錯(cuò)誤。

額外屬性檢查:

說(shuō)起來(lái)這一點(diǎn),簡(jiǎn)單總結(jié)一下就是:我們可以設(shè)置屬性是可選的,但是不能傳錯(cuò)誤的屬性。

  • 以上面的 Person 接口為例,如果我們使用時(shí)把 age 屬性 錯(cuò)誤寫成了 aag,typescript 會(huì)報(bào)錯(cuò),即使 age 屬性本身不是必須傳的。

這就是額外屬性檢查。

當(dāng)然,我們也可以使用 類型斷言 繞開這些屬性檢查,上鏈接:TypeScript中的類型斷言[as語(yǔ)法 | <> 語(yǔ)法]

設(shè)置接口只讀屬性:

一些對(duì)象屬性只能在對(duì)象剛剛創(chuàng)建的時(shí)候修改其值。 所以我們可以在屬性名前用 readonly來(lái)指定只讀屬性 。

interface Person {
    readonly name: string;
    readonly age: number;
}
// 賦初始值
let man: Person = {name: 'syw', age: 10};

// 如果此時(shí)在對(duì)值進(jìn)行修改,就會(huì)出錯(cuò)。
man.age = 20;// error!
// Cannot assign to 'age' because it is a read-only property.

說(shuō)起來(lái),只讀屬性使用起來(lái)的效果和 const 差不多,當(dāng)然兩者根本不是一個(gè)東西,我這么說(shuō)只是為了好理解。

在Typescript中是這么描述 readonly 和 const 的:
  • 最簡(jiǎn)單判斷該用readonly還是const的方法是看要把它做為變量使用還是做為一個(gè)屬性。 做為變量使用的話用 const,若做為屬性則使用readonly。

函數(shù)類型接口:

簡(jiǎn)單來(lái)說(shuō),函數(shù)類型的接口就是規(guī)定了 函數(shù)的參數(shù)類型以及函數(shù)的返回值類型。

interface PersonFun {
    (name: string, age: number): boolean
}
// 定義函數(shù),符合 PersonFun 約束
let manFun: PersonFun = (name: string, age: number) => {
    return age > 10;
}

注意:

  1. 函數(shù)參數(shù)類型不可更改,包括返回值也必須遵守約束。

  2. 函數(shù)參數(shù)名可以不用和接口中的名字對(duì)應(yīng),只要求對(duì)應(yīng)參數(shù)位置的類型兼容。

// 這樣也是符合要求的
let manFun: PersonFun = (name12: string, age12: number) => {
    return age > 10;
}

可索引類型接口:

可索引類型接口簡(jiǎn)單來(lái)說(shuō)就是,我們可以規(guī)定 索引的類型 和 返回值的類型。

  • 例如:數(shù)組中,我們可以規(guī)定 以 number 類型的值來(lái)索引,索引到的是一個(gè) string 類型的值,這樣的話其實(shí)這個(gè)數(shù)組的形式基本就固定了。

interface PersonArr {
    [index: number]: string
}
// 定義數(shù)組
let manArr: PersonArr = ['syw','syw1','syw2'];
// 查詢
manArr[0]; // 此時(shí) 0 作為索引是 number 類型,0 號(hào)元素返回的是 syw 是 string 類型

Typescript 中支持兩種索引簽名,其實(shí)就是索引類型,分別是:number 和 string。

并且,如果我們使用 number 類型的索引,那么定義的返回值類型 必須是 定義 string 類型索引返回值的子類型。

Typescript 是這么解釋這句話的:

  • 當(dāng)使用 number來(lái)索引時(shí),JavaScript會(huì)將它轉(zhuǎn)換成string然后再去索引對(duì)象。也就是說(shuō)用 100(一個(gè)number)去索引等同于使用"100"(一個(gè)string)去索引,因此兩者需要保持一致。

我一開始看到這句話的時(shí)候,文字意思看懂了,但是不知道怎么去簡(jiǎn)單的表述這句話,仔細(xì)研究了一下才知道【可能是我太菜】,其實(shí)很簡(jiǎn)單:

// 比如我這個(gè) PersonArr 有兩個(gè)索引,一個(gè)是 index(number)類型,一個(gè)是 item(string) 類型,那么我在定義這個(gè)兩個(gè)索引的返回值的時(shí)候,就必須嚴(yán)格遵守上面說(shuō)的:
// 使用 number 類型的索引,那么定義的返回值類型 必須是 定義 string 類型索引返回值的子類型。

// 所以我下面定義的這個(gè)接口就會(huì)報(bào)錯(cuò)
interface PersonArr {
    [index: number]: string;
    [item: string]: number;
}
// 因?yàn)?nbsp;index 返回值是 string 類型 ,很顯然不是 item 返回值 number 類型的子類型
// 怎么寫才對(duì)呢?最簡(jiǎn)單的方法,把 index 返回值的類型也改成 number 就好了。

感謝各位的閱讀,以上就是“TypeScript怎么定義接口”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)TypeScript怎么定義接口這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI