TS筆記之 接口

接口

介紹

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

可選屬性

帶有可選屬性的接口與普通的接口定義差不多栖袋,只是在可選屬性名字定義的后面加一個(gè) \color{#bf414a}{?} 符號(hào)叹卷。

interface SquareConfig {
  color?: string;
  width?: number;
}

只讀屬性

一些對(duì)象屬性只能在對(duì)象剛剛創(chuàng)建的時(shí)候修改其值。 你可以在屬性名前用\color{#bf414a}{readonly } 來指定只讀屬性:

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

TypeScript 具有 \color{#bf414a}{ReadonlyArray<T> } 類型绅作,它與 Array<T>相似芦圾,只是把所有可變方法去掉了,因此可以確保數(shù)組創(chuàng)建后再也不能被修改:

let a: number[] = [1, 2, 3, 4];
let ro: ReadonlyArray<number> = a;
ro[0] = 12; // error!
ro.push(5); // error!
ro.length = 100; // error!
a = ro; // error!

額外的屬性檢查

添加一個(gè)字符串索引簽名, 前提是你能夠確定這個(gè)對(duì)象可能具有某些做為特殊用途使用的額外屬性

interface SquareConfig {
  color?: string;
  width?: number;
  [propName: string]: any;
}

函數(shù)類型

接口能夠描述 JavaScript 中對(duì)象擁有的各種各樣的外形俄认。 除了描述帶有屬性的普通對(duì)象外个少,接口也可以描述函數(shù)類型。

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

let mySearch: SearchFunc;
mySearch = function (src: string, sub: string): boolean {
  let result = src.search(sub);
  return result > -1;
};

可索引的類型

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

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

let myArray: StringArray;
myArray = ["Bob", "Fred"];

let myStr: string = myArray[0];

TypeScript 支持兩種索引簽名:字符串和數(shù)字萎津。 可以同時(shí)使用兩種類型的索引卸伞,但是數(shù)字索引的返回值必須是字符串索引返回值類型的子類型。

class Animal {
  name: string;
}
class Dog extends Animal {
  breed: string;
}

// 錯(cuò)誤:使用數(shù)值型的字符串索引锉屈,有時(shí)會(huì)得到完全不同的Animal!
interface NotOkay {
  [x: number]: Animal;
  [x: string]: Dog;
}

類類型

實(shí)現(xiàn)接口

與 C#或 Java 里接口的基本作用一樣荤傲,TypeScript 也能夠用它來明確的強(qiáng)制一個(gè)類去符合某種契約

interface ClockInterface {
  currentTime: Date;
  setTime(d: Date);
}

class Clock implements ClockInterface {
  currentTime: Date;
  setTime(d: Date) {
    this.currentTime = d;
  }
  constructor(h: number, m: number) {}
}

接口描述了類的公共部分,而不是公共和私有兩部分部念。 它不會(huì)幫你檢查類是否具有某些私有成員弃酌。

類靜態(tài)部分與實(shí)例部分的區(qū)別

當(dāng)你操作類和接口的時(shí)候氨菇,你要知道類是具有兩個(gè)類型的:靜態(tài)部分的類型和實(shí)例的類型。 你會(huì)注意到妓湘,當(dāng)你用構(gòu)造器簽名去定義一個(gè)接口并試圖定義一個(gè)類去實(shí)現(xiàn)這個(gè)接口時(shí)會(huì)得到一個(gè)錯(cuò)誤:

interface ClockConstructor {
  new (hour: number, minute: number);
}

//類“Clock”錯(cuò)誤實(shí)現(xiàn)接口“ClockConstructor”查蓉。
class Clock implements ClockConstructor {
  currentTime: Date;
  constructor(h: number, m: number) {}
}

這里因?yàn)楫?dāng)一個(gè)類實(shí)現(xiàn)了一個(gè)接口時(shí),只對(duì)其實(shí)例部分進(jìn)行類型檢查榜贴。 constructor 存在于類的靜態(tài)部分豌研,所以不在檢查的范圍內(nèi)。

因此唬党,我們應(yīng)該直接操作類的靜態(tài)部分鹃共。 看下面的例子,我們定義了兩個(gè)接口驶拱, ClockConstructor 為構(gòu)造函數(shù)所用和 ClockInterface 為實(shí)例方法所用霜浴。 為了方便我們定義一個(gè)構(gòu)造函數(shù) createClock,它用傳入的類型創(chuàng)建實(shí)例蓝纲。

interface ClockConstructor {
  new (hour: number, minute: number): ClockInterface;
}
interface ClockInterface {
  tick();
}

function createClock(ctor: ClockConstructor, hour: number, minute: number): ClockInterface {
  return new ctor(hour, minute);
}

class DigitalClock implements ClockInterface {
  constructor(h: number, m: number) {}
  tick() {
    console.log("beep beep");
  }
}
class AnalogClock implements ClockInterface {
  constructor(h: number, m: number) {}
  tick() {
    console.log("tick tock");
  }
}

let digital = createClock(DigitalClock, 12, 17);
let analog = createClock(AnalogClock, 7, 32);

繼承接口

單繼承

interface Shape {
  color: string;
}

interface Square extends Shape {
  sideLength: number;
}

let square = <Square>{};
square.color = "blue";
square.sideLength = 10;

多繼承

interface Shape {
  color: string;
}

interface PenStroke {
  penWidth: number;
}

interface Square extends Shape, PenStroke {
  sideLength: number;
}

let square = <Square>{};
square.color = "blue";
square.sideLength = 10;
square.penWidth = 5.0;

接口繼承類

當(dāng)接口繼承了一個(gè)類類型時(shí)阴孟,它會(huì)繼承類的成員但不包括其實(shí)現(xiàn)。 就好像接口聲明了所有類中存在的成員税迷,但并沒有提供具體實(shí)現(xiàn)一樣永丝。 接口同樣會(huì)繼承到類的 private 和 protected 成員。 這意味著當(dāng)你創(chuàng)建了一個(gè)接口繼承了一個(gè)擁有私有或受保護(hù)的成員的類時(shí)箭养,這個(gè)接口類型只能被這個(gè)類或其子類所實(shí)現(xiàn)(implement)慕嚷。

當(dāng)你有一個(gè)龐大的繼承結(jié)構(gòu)時(shí)這很有用,但要指出的是你的代碼只在子類擁有特定屬性時(shí)起作用毕泌。 這個(gè)子類除了繼承至基類外與基類沒有任何關(guān)系喝检。 例:

class Control {
  private state: any;
}

interface SelectableControl extends Control {
  select(): void;
}

class Button extends Control implements SelectableControl {
  select() {}
}

class TextBox extends Control {
  select() {}
}

// 錯(cuò)誤:“Image”類型缺少“state”屬性。
class Image implements SelectableControl {
  select() {}
}

class Location {}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末懈词,一起剝皮案震驚了整個(gè)濱河市蛇耀,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌坎弯,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件译暂,死亡現(xiàn)場(chǎng)離奇詭異抠忘,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)外永,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門崎脉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人伯顶,你說我怎么就攤上這事囚灼÷嫦ィ” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵灶体,是天一觀的道長(zhǎng)阅签。 經(jīng)常有香客問我,道長(zhǎng)蝎抽,這世上最難降的妖魔是什么政钟? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮樟结,結(jié)果婚禮上养交,老公的妹妹穿的比我還像新娘。我一直安慰自己瓢宦,他們只是感情好碎连,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著驮履,像睡著了一般破花。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上疲吸,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天座每,我揣著相機(jī)與錄音,去河邊找鬼摘悴。 笑死峭梳,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蹂喻。 我是一名探鬼主播葱椭,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼口四!你這毒婦竟也來了孵运?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤蔓彩,失蹤者是張志新(化名)和其女友劉穎治笨,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赤嚼,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡旷赖,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了更卒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片等孵。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蹂空,靈堂內(nèi)的尸體忽然破棺而出俯萌,到底是詐尸還是另有隱情果录,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布咐熙,位于F島的核電站弱恒,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏糖声。R本人自食惡果不足惜斤彼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蘸泻。 院中可真熱鬧琉苇,春花似錦、人聲如沸悦施。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽抡诞。三九已至穷蛹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間昼汗,已是汗流浹背肴熏。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留顷窒,地道東北人蛙吏。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像鞋吉,于是被迫代替她去往敵國(guó)和親鸦做。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

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