TypeScript基礎(chǔ)入門 - 接口 - 可索引的類型

轉(zhuǎn)載地址

TypeScript基礎(chǔ)入門 - 接口 - 可索引的類型

項(xiàng)目實(shí)踐倉(cāng)庫(kù)

https://github.com/durban89/typescript_demo.git
tag: 1.0.11

為了保證后面的學(xué)習(xí)演示需要安裝下ts-node,這樣后面的每個(gè)操作都能直接運(yùn)行看到輸出的結(jié)果。

npm install -D ts-node

后面自己在練習(xí)的時(shí)候可以這樣使用

npx ts-node src/learn_basic_types.ts
npx ts-node 腳本路徑

接口

TypeScript的核心原則之一是對(duì)值所具有的結(jié)構(gòu)進(jìn)行類型檢查。 它有時(shí)被稱做“鴨式辨型法”或“結(jié)構(gòu)性子類型化”。 在TypeScript里,接口的作用就是為這些類型命名和為你的代碼或第三方代碼定義契約。

可索引的類型

與使用接口描述函數(shù)類型差不多,我們也可以描述那些能夠“通過索引得到”的類型,比如a[10]或ageMap["daniel"]。 可索引類型具有一個(gè) 索引簽名,它描述了對(duì)象索引的類型,還有相應(yīng)的索引返回值類型。 讓我們看一個(gè)例子:

interface SomeArray {
    [index: number]: string;
}

let someArray: SomeArray;
someArray = ["string1", "string2"];

let str: string = someArray[0];
console.log(str);

運(yùn)行后結(jié)果如下

string1

上面例子里,我們定義了SomeArray接口,它具有索引簽名。 這個(gè)索引簽名表示了當(dāng)用 number去索引SomeArray時(shí)會(huì)得到string類型的返回值。共有支持兩種索引簽名:字符串和數(shù)字。 可以同時(shí)使用兩種類型的索引,但是數(shù)字索引的返回值必須是字符串索引返回值類型的子類型。 這是因?yàn)楫?dāng)使用 number來索引時(shí),JavaScript會(huì)將它轉(zhuǎn)換成string然后再去索引對(duì)象。 也就是說用 100(一個(gè)number)去索引等同于使用"100"(一個(gè)string)去索引,因此兩者需要保持一致。

class Person {
    name: string;
}
class Student extends Person {
    className: string;
}

// 錯(cuò)誤:使用數(shù)值型的字符串索引,有時(shí)會(huì)得到完全不同的Person!
interface NotOkay {
    // [x: number]: Person; // 數(shù)字索引類型“Person”不能賦給字符串索引類型“Student”
    [x: string]: Student;
}

字符串索引簽名能夠很好的描述dictionary模式,并且它們也會(huì)確保所有屬性與其返回值類型相匹配。 因?yàn)樽址饕暶髁?obj.property和obj["property"]兩種形式都可以。 下面的例子里, name的類型與字符串索引類型不匹配,所以類型檢查器給出一個(gè)錯(cuò)誤提示:

interface SomeInterface {
    [index: string]: string
    // length: number    // 錯(cuò)誤,`length`的類型與索引類型返回值的類型不匹配
    name: string       // 可以,name是string類型
}

最后,你可以將索引簽名設(shè)置為只讀,這樣就防止了給索引賦值:

interface SomeInterface {
    [index: string]: string
    // length: number    // 錯(cuò)誤,`length`的類型與索引類型返回值的類型不匹配
    name: string       // 可以,name是string類型
}

interface ReadonlySomeArray {
    readonly [index: number]: string;
}
let readonlyArray: ReadonlySomeArray = ["string1", "string2"];
readonlyArray[2] = "string3"; // error!

運(yùn)行后會(huì)得到如下錯(cuò)誤提示

src/interface_6.ts(36,1): error TS2542: Index signature in type 'ReadonlySomeArray' only permits reading.

你不能設(shè)置readonlyArray[2],因?yàn)樗饕灻侵蛔x的。

本實(shí)例結(jié)束實(shí)踐項(xiàng)目地址

https://github.com/durban89/typescript_demo.git
tag: 1.0.12
?著作權(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 一、Java 簡(jiǎn)介 Java是由Sun Microsystems公司于1995年5月推出的Java面向?qū)ο蟪绦蛟O(shè)計(jì)...
    子非魚_t_閱讀 4,667評(píng)論 1 44
  • Lua 5.1 參考手冊(cè) by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 14,264評(píng)論 0 38
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,724評(píng)論 19 139
  • (一) 有時(shí)候常想, 余生也許再也沒有人, 比你更稱得上我靈感的繆斯。 (二) 有時(shí)候常想, 如果可以回到過去, ...
    蘇顏_688閱讀 259評(píng)論 4 0
  • 我曾經(jīng)無數(shù)次的坐火車經(jīng)過這個(gè)地方、卻無從知道窗外的你已經(jīng)全然不是記憶里的模樣、夢(mèng)回千百遍,真正到了卻都是...
    558簡(jiǎn)汐閱讀 764評(píng)論 0 0

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