国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

TypeScript學習6-函數(shù)

fuyi501 / 2683人閱讀

摘要:類型聲明中的函數(shù)定義,需要聲明參數(shù)和返回值的類型。其中隱藏有一個點類型推斷,箭頭函數(shù)沒有聲明返回值類型,這里編譯器不會報錯,因為它可以推斷出返回值類型。

引言

TypeScript中的函數(shù)和JavaScript中的函數(shù),和其他特性相比,是相差不大的。
這里會補充一點進階知識。

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

下面列舉一些TypeScript中函數(shù)相關(guā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ù)定義。
其中隱藏有一個點:類型推斷,箭頭函數(shù)沒有聲明返回值類型,這里編譯器不會報錯,因為它可以推斷出返回值類型。這個特性,在數(shù)據(jù)類型學習的時候也接觸過,規(guī)則也是類似的:能推斷出類型的,不需要顯示聲明

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

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

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

這里:

level參數(shù)是有一個默認值的

prefix參數(shù)是可選的

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

剩余參數(shù)

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

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

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

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

進階知識點 this指向

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

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

箭頭函數(shù)

箭頭函數(shù)的出現(xiàn),可以緩解了這個難題。箭頭函數(shù)中的this,是和定義的上下文相關(guān)(底層是利用閉包實現(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"));
閉包實現(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里面會麻煩一點,需要聲明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的重載,我是感覺有點牽強的,如下示例:

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");

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

無法實現(xiàn)類似靜態(tài)語言的重載的原因之前也提過:靜態(tài)語言,如Java,函數(shù)重載,是生成了多個不同名的函數(shù),同時使用的地方也會被更新成對應的函數(shù)名。TypeScript要兼容JavaScript,這個就無法實現(xiàn)。
高階函數(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);

下面再學一個復雜一點的案例,前置處理器。比如,我們要在請求數(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);
})

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

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

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)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/105956.html

相關(guān)文章

  • TypeScript入門學習之路

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

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

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

    sixleaves 評論0 收藏0
  • TypeScript Start: 什么是 TypeScript

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

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

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

    caozhijian 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<