TS: 接口

接口算是官方文檔里的第一個(gè)知識(shí)點(diǎn)了弥臼,這篇文章會(huì)簡單介紹 TypeScrip 里的接口。

類型

在說接口之前我們先來了解下 TypeScript 里的類型掺栅,因?yàn)樵诮涌诘氖褂煤皖愋兔懿豢煞帧?/p>

JS 類型

JS 有 7 種數(shù)據(jù)類型

  • number
  • string
  • boolean
  • object纳猪,里面包含 Array, Function, Date, Object, RegExp 等
  • symbol,這是 ES 6 里的氏堤,主要用來表示一個(gè)東西是唯一的,實(shí)際上比較少用闪檬。好吧,根本沒用過粗悯。。横缔。
  • null衫哥,表示空
  • undefined,表示未定義
let bool: boolean = true
let str: string = 'Hi'
let num: number = 1.222
let obj: object = {name: 'Jack'}
let n: null = null
let u: undefined = undefined

TS 的新類型

any

如果在 TS 里沒有聲明類型炕檩,那么默認(rèn)就是 any 類型,這樣就直接一夜回到 JS 時(shí)代笛质。

let a: number = 1
a = 'Hello' // 報(bào)錯(cuò)

let a: any = 1
a = 'Hello' // OK

enum

枚舉類主要用來規(guī)定只能選 XXX 或者 YYY,如

enum Gender {
    Male = 'Male',
    Female = 'Female'
}

let gender: Gender = Gender.Male

gender = Gender.Female
console.log(gender) // 'Female'

gender = Gender.Woman // 報(bào)錯(cuò)

而如果不在 enum 里初始化跷究,那么 MaleFemale 的值就會(huì)以數(shù)值的方式顯示敲霍。

enum Gender {
    Male,
    Female
}

let gender: Gender = Gender.Male

gender = Gender.Male
console.log(gender) // 0
gender = Gender.Female
console.log(gender) // 1

void

這個(gè)類型就是指空值,在 C 語言和 Java 里應(yīng)該是很常見的肩杈,一般用在函數(shù)的返回值里。

function fn(): void {
    console.log('fn')
}

斷言

斷言的用法是主觀地認(rèn)為這個(gè)變量的類型是什么艘儒,如

let n: any = '123'

console.log(<string>n.split(''))

這里主觀地認(rèn)為 n 是一個(gè)字符串夫偶,但是聲明的時(shí)候確是 any 類型。如果主觀認(rèn)為錯(cuò)了翻斟,會(huì)報(bào)錯(cuò)说铃。

let n: any = 123

console.log(<string>n.split('')) // 報(bào)錯(cuò)

也可以用 as 來斷言敞斋。

let n: any = '123'
console.log((n as string).split(''))

這個(gè)一般可以用在表單組件的測試用例里,首先模擬用戶輸入非法類型,然后 expect(xxxx).to.拋出TS主觀錯(cuò)誤 就可以完成一個(gè)測試用例了阳柔。

接口基礎(chǔ)

現(xiàn)在回到我們的主題蚓峦。在學(xué)習(xí) Java 的時(shí)候我就覺得這個(gè)名字很難理解,不知道用來干嘛的暑椰,因?yàn)?Java 還有一個(gè)抽象類,兩者很像而且使用場景差不多避消,但是用法又有點(diǎn)差別召夹,真的煩。幸好 TS 里就只有接口监憎,還是容易理解一些。

接口簡單來說就是規(guī)定一些 “事”偷霉,在后臺(tái)中褐筛,接口指的是雙方規(guī)定的 API,在 TS 里接口一般指這個(gè)變量擁有什么東西瞒滴。

interface Shape {
    head: string;
    arm: string;
}
interface Human {
    name: string;
    age: number;
    shape: Shape;
    say(word: string): void;
}

let jack: Human = {
    name: 'Jack',
    age: 18,
    shape: {
        head: 'head',
        arm: 'arm'
    },
    say(word: string) {
        console.log(word)
    }
}
jack.say('hi')

上面規(guī)定了類型為 Shape 的變量應(yīng)該有 headarm赞警,而 Human 類型的應(yīng)該有 name, age, shape, say 屬性。其中還對函數(shù)以及 shape 做了一些規(guī)定世剖。

這就是接口笤虫,不過是一些規(guī)范而已祖凫。

接口里的屬性

接口除了對屬性類型做了規(guī)定酬凳,還能做以下規(guī)定

readonly

interface Human {
    readonly name: string
}

let jack: Human = {
    name: 'Jack'
}

jack.name = 'Ivan' // 報(bào)錯(cuò): name 是只讀的

這里指定 name 是只讀的,初始化后就不能再次賦值了宁仔。

可選

有時(shí)候我們不一定要設(shè)置對象里的某個(gè)屬性,接口里可以用 "?" 來表示一個(gè)屬性是否是可選的权埠。

interface Human {
    gender: string,
    age?: number
}

let jack: Human = {
    gender: 'Male'
    // 可以不賦值 age 屬性煎谍,因?yàn)槭强蛇x的
}

描述屬性

除此之外,我們還可以控制接口里屬性規(guī)定的寫法满俗,不懂作岖?看代碼。

interface Rect {
    height: number;
    width: number;
    [propName: string]: number
}

這里規(guī)定 Rect 這個(gè)接口里 Key: Value 對只能是 Key 為 string 類型鳍咱,而 Value 為 number 類型。

函數(shù)接口

因?yàn)楹瘮?shù)也是對象蓄坏,所以我們也可以通過接口來對函數(shù)做“規(guī)定”丑念。

interface Fn {
    (a: number, b: number): number;
}

let add: Fn = function(a: number, b: number): number {
    return a + b
}

console.log(add(1, 2))

這里定義了 Fn 接口,規(guī)定了參數(shù)的類型為 number渔彰,返回值的類型為 number推正。

接口的繼承

就像 ES 6 的 class 一樣,接口也可以做繼承操作植榕,效果就是會(huì)繼承父接口的“規(guī)定”。

interface Animal {
    move(): void;
}

interface Human extends Animal {
    name: string;
    age: number;
}

let jack: Human = {
    age: 18,
    name: 'Jack',
    move() {
        console.log('move')
    }
}

Human 接口繼承了 Animal 里的 move 函數(shù)的“規(guī)定”炒瘸,所以在初始化 jack 變量時(shí)也要加上 move 函數(shù),否則報(bào)錯(cuò)拐邪。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末隘截,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌统台,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件井赌,死亡現(xiàn)場離奇詭異贵扰,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)纹坐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進(jìn)店門舞丛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來球切,“玉大人,你說我怎么就攤上這事吨凑。” “怎么了糙臼?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵恩商,是天一觀的道長。 經(jīng)常有香客問我韧献,道長,這世上最難降的妖魔是什么锤窑? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任渊啰,我火速辦了婚禮,結(jié)果婚禮上绘证,老公的妹妹穿的比我還像新娘。我一直安慰自己胞枕,他們只是感情好魏宽,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著派桩,像睡著了一般蚌斩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上送膳,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天肠缨,我揣著相機(jī)與錄音,去河邊找鬼晒奕。 笑死,一個(gè)胖子當(dāng)著我的面吹牛魄眉,可吹牛的內(nèi)容都是我干的闷袒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼晃择,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了宫屠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤抵栈,失蹤者是張志新(化名)和其女友劉穎坤次,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體产艾,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡洛波,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年蹬挤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了棘幸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,727評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡吨悍,死狀恐怖蹋嵌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情栽烂,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布焰手,位于F島的核電站怀喉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏躬拢。R本人自食惡果不足惜见间,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一缤剧、第九天 我趴在偏房一處隱蔽的房頂上張望域慷。 院中可真熱鬧,春花似錦犹褒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至慰丛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間哪亿,已是汗流浹背贤笆。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留篡殷,地道東北人埋涧。 一個(gè)月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像戳气,于是被迫代替她去往敵國和親巧鸭。 傳聞我的和親對象是個(gè)殘疾皇子瓶您,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容