成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

TypeScript學(xué)習(xí)6-函數(shù)

fuyi501 / 2688人閱讀

摘要:類型聲明中的函數(shù)定義,需要聲明參數(shù)和返回值的類型。其中隱藏有一個(gè)點(diǎn)類型推斷,箭頭函數(shù)沒有聲明返回值類型,這里編譯器不會(huì)報(bào)錯(cuò),因?yàn)樗梢酝茢喑龇祷刂殿愋汀?/p>

引言

TypeScript中的函數(shù)和JavaScript中的函數(shù),和其他特性相比,是相差不大的。
這里會(huì)補(bǔ)充一點(diǎn)進(jìn)階知識(shí)。

函數(shù)相關(guān)的知識(shí)點(diǎn)

下面列舉一些TypeScript中函數(shù)相關(guān)的知識(shí)點(diǎn)。

類型聲明

TypeScript中的函數(shù)定義,需要聲明參數(shù)和返回值的類型。

// function add
function add(x: number, y: number): number {
    return x + y;
}
// arrow funtion add
const add = (x: number, y: number) => x + y;

上面是兩種基本用法:普通函數(shù)定義、箭頭函數(shù)定義。
其中隱藏有一個(gè)點(diǎn):類型推斷,箭頭函數(shù)沒有聲明返回值類型,這里編譯器不會(huì)報(bào)錯(cuò),因?yàn)樗梢酝茢喑龇祷刂殿愋?。這個(gè)特性,在數(shù)據(jù)類型學(xué)習(xí)的時(shí)候也接觸過,規(guī)則也是類似的:能推斷出類型的,不需要顯示聲明

可選參數(shù)和參數(shù)默認(rèn)值

這兩個(gè)特性實(shí)際使用的時(shí)候是很有用的,很清晰,也省掉不少代碼。

// function log
function myLog(message: string,  level: ("info" | "warn" | "error") = "info", prefix?: string): void {
  // todo, logging
}

這里:

level參數(shù)是有一個(gè)默認(rèn)值的

prefix參數(shù)是可選的

注意一點(diǎn):可選參數(shù)必須放最后

剩余參數(shù)

剩余參數(shù)就是,剩余的其他參數(shù),這里用到了結(jié)構(gòu),看示例。

function myCallback(status: boolean, ...restData: any[]) {
  console.log(`${status}: ${restData.join()}`);
}

myCallback(false);
myCallback(true, "完成一個(gè)");
myCallback(true, "完成第一個(gè)", "完成第二個(gè)");

剩余參數(shù)使用起來非常靈活。

進(jìn)階知識(shí)點(diǎn) this指向

JavaScript中的this是個(gè)入門的難點(diǎn),JavaScript函數(shù)的this是和調(diào)用上下文直接相關(guān)的,和定義不相關(guān),所以很容易出現(xiàn)this指向和預(yù)期不一致的問題。

目前有幾種解決方案:this綁定、箭頭函數(shù)、閉包。

箭頭函數(shù)

箭頭函數(shù)的出現(xiàn),可以緩解了這個(gè)難題。箭頭函數(shù)中的this,是和定義的上下文相關(guān)(底層是利用閉包實(shí)現(xiàn)的),如下例:

const myLottery = {
  prizes: ["pen", "pencil", "notebook", "dictionary"],
  getDraw: function() {
    return (name: string) => {
      const result = Math.floor(Math.random() * 4);
      return `Bingo, ${name}, you win the ${this.prizes[result]}!`;
    }
  }
}

const myDraw = myLottery.getDraw();
console.log(myDraw("Tom"));
閉包實(shí)現(xiàn)

閉包方案就是在函數(shù)上下文中把this保存在變量中。

  ...
  getDraw: function() {
    const _this = this;
    return function (name: string) {
      const result = Math.floor(Math.random() * 4);
      return `Bingo, ${name}, you win the ${_this.prizes[result]}!`;
    }
  }
  ...
bind綁定

bind綁定在TypeScript里面會(huì)麻煩一點(diǎn),需要聲明this類型,否則編譯不過,提示this類型不確定。

interface Lottery {
  prizes: string[];
  getDraw(): {(name: string): string};
}

const myLottery: Lottery = {
  prizes: ["pen", "pencil", "notebook", "dictionary"],
  getDraw: function() {
    return function (this: Lottery, name: string) {
      const result = Math.floor(Math.random() * 4);
      return `Bingo, ${name}, you win the ${this.prizes[result]}!`;
    }.bind(this);
  }
}

const myDraw = myLottery.getDraw();
console.log(myDraw("Tom"));
函數(shù)重載

TypeScript的重載,我是感覺有點(diǎn)牽強(qiáng)的,如下示例:

function myAdd(x: number, y: number): number;
function myAdd(x: string, y: string): string;
function myAdd(x, y): any {
  if (typeof x === "number" && typeof y === "number") {
    return x + y;
  } else if (typeof x === "string" && typeof y === "string") {
    return x + y;
  }
}

myAdd(1, 2);
myAdd("Hello", "world");

這種實(shí)現(xiàn),其實(shí)就是動(dòng)態(tài)參數(shù)的分支處理,好處是代碼提示比較友好,能識(shí)別出來重載。

無法實(shí)現(xiàn)類似靜態(tài)語言的重載的原因之前也提過:靜態(tài)語言,如Java,函數(shù)重載,是生成了多個(gè)不同名的函數(shù),同時(shí)使用的地方也會(huì)被更新成對(duì)應(yīng)的函數(shù)名。TypeScript要兼容JavaScript,這個(gè)就無法實(shí)現(xiàn)。
高階函數(shù)

高階函數(shù)聽起來很高大上,其實(shí)概念并不難:參數(shù)是函數(shù)或返回值是函數(shù)的函數(shù)。

我們接觸比較多的比如,數(shù)組內(nèi)置的map方法。

// 數(shù)組元素自增
let arr  = [1, 2, 3];

// 傳統(tǒng)方式
for(let i=0; i < arr.length; i++) {
    arr[i]++;
}

// map
arr = arr.map(function(item) {
    return item + 1;
});

// 結(jié)合箭頭函數(shù)
arr = arr.map(item => item + 1);

下面再學(xué)一個(gè)復(fù)雜一點(diǎn)的案例,前置處理器。比如,我們要在請(qǐng)求數(shù)據(jù)之前,記錄一些日志。

interface Request {
  (url: string, options: {[key: string]: any}): Promise;
}

function withLog(func: Request): Request {
  return function(url: string, options: {[key: string]: any}) {
    console.log("request");
    return func(url, options);
  };
}

function myRequest(url: string, options: {[key: string]: any}) {
  return new Promise(function(resolve) {
      setTimeout(() => {
        resolve("completed!")   
      }, 1000);
  });
}

withLog(myRequest)("/a", {method: "post"}).then(val => {
  console.log(val);
})

上述方案就是把請(qǐng)求函數(shù)通過另外一個(gè)函數(shù)包裝成一個(gè)新的函數(shù)。

再復(fù)雜一點(diǎn),像這樣,參數(shù)是函數(shù),返回值也是函數(shù)的,是可以無限嵌套的,每嵌套一次,它就多了一個(gè)功能。這在很多框架里面特別常見,用于抽象和解耦。

function withLog2(func: Request): Request {
  return function(url: string, options: {[key: string]: any}) {
    return func(url, options).then(val => {
      return `[${val}]`;
    });
  };
}

withLog2(withLog(myRequest))("/a", {method: "post"}).then(val => {
  console.log(val);
})

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/105956.html

相關(guān)文章

  • TypeScript入門學(xué)習(xí)之路

    摘要:學(xué)習(xí)之路學(xué)習(xí)之路安裝環(huán)境起步開發(fā)工具自動(dòng)編譯文件中的數(shù)據(jù)類型中的函數(shù)中類的定義繼承中的繼承中的繼承類的靜態(tài)屬性和靜態(tài)方法類的多態(tài)的抽象類中的接口中的泛型學(xué)習(xí)之路安裝環(huán)境查看版本起步新建通過命令編譯此時(shí)路徑下 ...

    jemygraw 評(píng)論0 收藏0
  • 前端小知識(shí)--TypeSript和JavaScript到底是什么關(guān)系?

    摘要:想學(xué)好前端,真的要主動(dòng),然后對(duì)所有的英文文檔耐心一點(diǎn)。在年月日,國際組織發(fā)布了的第六版,該版本正式名稱為,但通常被稱為或者。自此,每年發(fā)布一次新標(biāo)準(zhǔn)。但保留了用于依賴注入的構(gòu)造函數(shù)參數(shù)類型。必須在構(gòu)造函數(shù)中聲明屬性,而不是在類的代碼體中。 從 TypeScript 到 ES6 到 ES5 在我初學(xué)前端的很長(zhǎng)一段時(shí)間,不愿意碰git,不愿意碰框架,總是嫌麻煩,連ES6也沒有怎么去弄明白...

    sixleaves 評(píng)論0 收藏0
  • TypeScript Start: 什么是 TypeScript

    摘要:最近開始用來寫項(xiàng)目,寫起來還是挺順暢的。和在類型上的區(qū)別被稱作是一種動(dòng)態(tài)腳本語言,其中有一個(gè)被瘋狂詬病的特性缺乏靜態(tài)強(qiáng)類型。當(dāng)然,這是可以的,此時(shí)變量的類型已經(jīng)發(fā)生改變字符串?dāng)?shù)字。 最近開始用 TypeScript 來寫項(xiàng)目,寫起來還是挺順暢的。其實(shí)學(xué)習(xí) TypeScript,看它的官方文檔就夠了,剩下就是 coding 了。我這里主要是我在 TypeScript 學(xué)習(xí)過程中記錄的一些...

    JeOam 評(píng)論0 收藏0
  • 新上課程推薦:TypeScript完全解讀(總26課時(shí))

    摘要:本套課程包含兩大部分,第一部分是基礎(chǔ)部分,也是重要部分,參考官方文檔結(jié)構(gòu),針對(duì)內(nèi)容之間的關(guān)聯(lián)性和前后順序進(jìn)行合理調(diào)整。 showImg(https://segmentfault.com/img/bVbpBA0?w=1460&h=400); 講師簡(jiǎn)介: iview 核心開發(fā)者,iview-admin 作者,百萬級(jí)虛擬渲染表格組件 vue-bigdata-table 作者。目前就職于知名互...

    caozhijian 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<