亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

TypeScript 中接口詳解

2019-11-20 12:13:03
字體:
來源:轉載
供稿:網友

在 TypeScript 中,接口是用作約束作用的,在編譯成 JavaScript 的時候,所有的接口都會被擦除掉,因為 JavaScript 中并沒有接口這一概念。

先看看一個簡單的例子:

function printLabel(labelledObj: { label: string }) {  console.log(labelledObj.label);}var myObj = { size: 10, label: "Size 10 Object" };printLabel(myObj);

那么在該方法中,labelledObj 的類型就是 {label: string},看上去可能有點復雜,但我們看見看看下面 myObj 的聲明就知道,這是聲明了一個擁有 size 屬性(值為 10)和 label 屬性(值為 "Size 10 Object")的對象。所以方法參數 labelledObj 的類型是 {label: string} 即表明參數擁有一個 string 類型的 label 屬性。

但是,這么寫的話,這個方法看上去還是有點讓人糊涂。那么就可以用接口(interface)來定義這個方法的參數類型。

interface LabelledValue {  label: string;}function printLabel(labelledObj: LabelledValue) {  console.log(labelledObj.label);}var myObj = { size: 10, label: "Size 10 Object" };printLabel(myObj);

可選屬性
有些時候,我們并不需要屬性一定存在,就可以使用可選屬性這一特性來定義。

interface SquareConfig {  color?: string;  width?: number;}function createSquare(config: SquareConfig): { color: string; area: number } {  var newSquare = { color: "white", area: 100 };  if (config.color) {    newSquare.color = config.color;  }  if (config.width) {    newSquare.area = config.width * config.width;  }  return newSquare;}var mySquare = createSquare({ color: "black" });

那么我們就傳入了實現一個 SquareConfig 接口的對象入 createSquare 方法。

既然完全是可有可無的,那么為什么還要定義呢?對比起完全不定義,定義可選屬性有兩個優點。1、如果存在屬性,能約束類型,這是十分關鍵的;2、能得到語法智能提示,假如誤將方法體中 color 寫成 collor,那么編譯是不通過的。

方法類型

在 JavaScript 中,方法 function 是一種基本類型。在面向對象思想中,接口的實現是靠類來完成的,而 function 作為一種類型,是不是能夠實現接口呢?答案是肯定的。

在 TypeScript 中,我們可以使用接口來約束方法的簽名。

interface SearchFunc { (source: string, subString: string): boolean;}var mySearch: SearchFunc;mySearch = function(source: string, subString: string) { var result = source.search(subString); if (result == -1) {  return false; } else {  return true; }}

上面代碼中,我們定義了一個接口,接口內約束了一個方法的簽名,這個方法有兩個字符串參數,返回布爾值。在第二段代碼中我們聲明了這個接口的實現。

需要注意的是,編譯器僅僅檢查類型是否正確(參數類型、返回值類型),因此參數的名字我們可以換成別的。

var mySearch: SearchFunc;mySearch = function(src: string, sub: string) { var result = src.search(sub); if (result == -1) {  return false; } else {  return true; }}

這樣也是能夠編譯通過的。

數組類型
在上面我們在接口中定義了方法類型,那么,數組類型又應該如何定義呢?很簡單。

interface StringArray { [index: number]: string;}var myArray: StringArray;myArray = ["Bob", "Fred"];

那么 myArray 就是一個數組,并且索引器是 number 類型,元素是 string。

在接口的定義里面,索引器的名字一般為 index(當然也可以改成別的,但一般情況下都是保持名字為 index)。所以改成

interface StringArray { [myIndex: number]: string;}var myArray: StringArray;myArray = ["Bob", "Fred"];

也是 ok 的。

需要注意的是,索引器的類型只能為 number 或者 string。

interface Array{  [index: number]: any;}interface Dictionary{  [index: string]: any;}

上面兩段都是可以編譯通過的。

最后還有一點要注意的是,如果接口已經是數組類型的話,接口中定義的其它屬性的類型都必須是該數組的元素類型。例如:

interface Dictionary { [index: string]: string; length: number;  // error, the type of 'length' is not a subtype of the indexer}

那么將無法編譯通過,需要將 length 改成 string 類型才可以。

使用類實現接口
一般情況下,我們還是習慣使用一個類,實現需要的接口,而不是像上面直接用接口。

interface ClockInterface {  currentTime: Date;}class Clock implements ClockInterface {  currentTime: Date;  constructor(h: number, m: number) { }}

在 TypeScript 中,使用 class 關鍵字來聲明了,這跟 EcmaScript 6 是一樣的。

另外,我們可以使用接口來約束類中定義的方法。

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

在 TypeScript 中,我們可以為接口定義構造函數。

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

接下來天真的我們可能會接著這么寫:

interface ClockInterface {  new (hour: number, minute: number);}class Clock implements ClockInterface {  currentTime: Date;  constructor(h: number, m: number) { }}

這是不行的?。?!因為構造函數是 static(靜態)的,而類僅能夠實現接口中的 instance(實例)部分。

那么這個接口中定義的構造函數豈不是沒作用?既然 TypeScript 提供了這項功能,那么肯定不會是沒作用的。聲明的方法比較特殊:

interface ClockStatic {  new (hour: number, minute: number);}class Clock {  currentTime: Date;  constructor(h: number, m: number) { }}var cs: ClockStatic = Clock;var newClock = new cs(7, 30);

正常情況下我們是寫 new Clock 的,這里就將 Clock 類指向了 ClockStatic 接口。需要注意的是,newClock 變量的類型是 any。

繼承接口
像類一樣,接口也能實現繼承,使用的是 extends 關鍵字。

interface Shape {  color: string;}interface Square extends Shape {  sideLength: number;}var square = <Square>{};square.color = "blue";square.sideLength = 10;

當然也能繼承多個接口。

interface Shape {  color: string;}interface PenStroke {  penWidth: number;}interface Square extends Shape, PenStroke {  sideLength: number;}var square = <Square>{};square.color = "blue";square.sideLength = 10;square.penWidth = 5.0;

需要注意的是,盡管支持繼承多個接口,但是如果繼承的接口中,定義的同名屬性的類型不同的話,是不能編譯通過的。

interface Shape {  color: string;  test: number;}interface PenStroke {  penWidth: number;  test: string;}interface Square extends Shape, PenStroke {  sideLength: number;}

那么這段代碼就無法編譯通過了,因為 test 屬性的類型無法確定。

同時使用上面所述的類型
如果僅能單一使用某種類型,那么這接口也未免太弱了。但幸運的是,我們的接口很強大。

interface Counter {  (start: number): string;  interval: number;  reset(): void;}var c: Counter;c(10);c.reset();c.interval = 5.0;

這樣就使用到三種類型了,分別是方法(接口自己是個方法)、屬性、方法(定義了方法成員)。

以上所述就是本文的全部內容了,希望大家能夠喜歡。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91亚洲国产成人久久精品网站| 国产精品视频久久久久| 久久视频在线免费观看| 国产精品专区h在线观看| 九九热视频这里只有精品| 成人精品一区二区三区| 欧美成人四级hd版| 欧美电影在线观看网站| 亚洲日韩欧美视频| 91高清免费在线观看| 欧美性猛交xxx| 欧美性极品xxxx娇小| 伊人av综合网| 亚洲色图综合久久| 国产视频在线一区二区| 国产亚洲欧美日韩美女| 日韩国产中文字幕| 91色在线观看| 欧美丰满少妇xxxxx| 青青久久aⅴ北条麻妃| 韩剧1988在线观看免费完整版| 国产精品视频内| 精品久久久久久久久久久久| 国产v综合ⅴ日韩v欧美大片| 亚洲成年网站在线观看| 精品国偷自产在线视频99| 2025国产精品视频| 成人看片人aa| 国产综合色香蕉精品| 久久久这里只有精品视频| 亚洲a区在线视频| 久久久久久久久久久国产| 欧美激情亚洲视频| 精品偷拍一区二区三区在线看| 国产一级揄自揄精品视频| 国产午夜一区二区| 国产一区二区丝袜高跟鞋图片| 亚洲一二三在线| 欧美激情中文网| 一个人看的www久久| 欧美精品免费看| 国产精品免费久久久久影院| 久久人人97超碰精品888| 日本免费一区二区三区视频观看| 亚洲色图在线观看| 亚洲欧美国产制服动漫| 九色成人免费视频| 欧美高清视频在线播放| 中文字幕久久久| 2019亚洲男人天堂| 日本一区二区在线免费播放| 2019中文字幕在线观看| 色哟哟亚洲精品一区二区| 色偷偷偷亚洲综合网另类| 欧美午夜xxx| 日韩激情av在线播放| 欧美亚洲视频在线观看| 狠狠爱在线视频一区| 国产精品欧美风情| 色偷偷9999www| 日本精品久久电影| 2019中文字幕在线观看| 亚洲国产成人久久综合一区| 色婷婷综合久久久久中文字幕1| 午夜精品视频网站| 青青草原一区二区| 国产91ⅴ在线精品免费观看| 国产精品自产拍在线观看| 国产日韩在线免费| 欧美成人精品一区二区三区| 国产精品一区电影| 亚洲精品自拍视频| 91精品国产色综合久久不卡98| 精品亚洲一区二区三区在线观看| 波霸ol色综合久久| 亚洲午夜未满十八勿入免费观看全集| www.欧美视频| 亚洲摸下面视频| 久久久久久尹人网香蕉| 国产精品视频网| 亚洲精品国精品久久99热一| 午夜精品久久久久久99热软件| 亚洲视频网站在线观看| 91视频免费在线| 欧美性在线视频| 日韩精品在线视频| 欧美一区二粉嫩精品国产一线天| 亚洲精品99999| 亚洲国产精品久久91精品| 色综合影院在线| 国产精品成人一区二区三区吃奶| 国产成人精品av在线| 国语自产偷拍精品视频偷| 红桃av永久久久| 亚洲黄色www网站| 麻豆一区二区在线观看| 国产不卡精品视男人的天堂| 国产成人中文字幕| 热re91久久精品国99热蜜臀| 日本在线观看天堂男亚洲| 亚洲色图35p| 亚洲欧美制服另类日韩| 日韩av网站在线| 国产xxx69麻豆国语对白| 亚洲一区二区三区xxx视频| 亚洲大胆人体视频| 精品成人国产在线观看男人呻吟| 国产精品久久久久久亚洲影视| 久久久久久久久久亚洲| 欧美激情a∨在线视频播放| 久久精品久久久久久国产 免费| 国产成人一区二区三区| 亚洲精品国产精品自产a区红杏吧| 欧美国产日韩在线| 一本一道久久a久久精品逆3p| 中文字幕国产精品久久| 欧美区二区三区| 国产精品无码专区在线观看| 精品国产成人在线| 国产精品国产亚洲伊人久久| 日韩欧美在线视频日韩欧美在线视频| 不卡av电影在线观看| 国产精品91免费在线| 国产精品入口日韩视频大尺度| 高清欧美电影在线| 亚洲第一av网站| 欧美又大粗又爽又黄大片视频| 91av视频在线观看| 欧美片一区二区三区| 中文字幕日韩av| 91av免费观看91av精品在线| 中文字幕亚洲一区二区三区| 色999日韩欧美国产| 精品国产欧美一区二区三区成人| 欧美日韩一区二区三区在线免费观看| 在线观看亚洲视频| 亚洲图片制服诱惑| 精品福利在线观看| 日韩欧美精品中文字幕| 日韩av免费在线观看| 91在线观看免费高清| 狠狠躁夜夜躁人人爽超碰91| 91成人福利在线| 久久久精品中文字幕| 亚洲国产天堂网精品网站| 日韩在线观看免费高清完整版| 国产成人一区二区| 日本久久久久久久久| 精品国内产的精品视频在线观看| 国产精品网站大全| 91日韩在线播放| 国产亚洲欧洲高清| 欧美怡春院一区二区三区| 中文字幕精品www乱入免费视频| 亚洲欧美国产va在线影院| 97人洗澡人人免费公开视频碰碰碰| 中文字幕亚洲在线| 国产亚洲欧洲高清| 性色av一区二区咪爱| 国产福利精品av综合导导航| 国产99视频精品免视看7| 国产亚洲精品久久| 97超视频免费观看| 国产精品久久久久久久一区探花|