亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

精讀《Typescript 3.2 新特性》

cucumber / 1860人閱讀

摘要:引言發(fā)布了幾個(gè)新特性,主要變化是類型檢查更嚴(yán)格,對(duì)一些時(shí)髦功能拓展了類型支持。精讀這次改動(dòng)意圖非常明顯,是為了跟上的新語(yǔ)法?;究梢运闶菍?duì)社區(qū)的回饋。討論地址是精讀新特性如果你想?yún)⑴c討論,請(qǐng)點(diǎn)擊這里,每周都有新的主題,周末或周一發(fā)布。

1 引言

Typescript 3.2 發(fā)布了幾個(gè)新特性,主要變化是類型檢查更嚴(yán)格,對(duì) ES6、ES7 一些時(shí)髦功能拓展了類型支持。

2 概要

下面挑一些相對(duì)重要配置介紹。

strictBindCallApply

對(duì) bind call apply 更嚴(yán)格的類型檢測(cè)。

比如如下可以檢測(cè)出 apply 函數(shù)參數(shù)數(shù)量和類型的錯(cuò)誤:

function foo(a: number, b: string): string {
  return a + b;
}

let a = foo.apply(undefined, [10]); // error: too few argumnts

特別對(duì)一些 react 老代碼,函數(shù)需要自己 bind(this),在沒(méi)有用箭頭函數(shù)時(shí),可能經(jīng)常使用 this.foo = this.foo.bind(this),這時(shí)類型可能會(huì)不準(zhǔn),但升級(jí)到 TS3.2 后,可以準(zhǔn)確捕獲到錯(cuò)誤了。

Object spread 類型自動(dòng)合并

現(xiàn)在 Object spread 類型可以自動(dòng)合并了:

// Returns "T & U"
function merge(x: T, y: U) {
  return { ...x, ...y };
}
Object rest 類型自動(dòng)剔除
const { x, y, z, ...rest } = obj;

當(dāng)我們使用了 Object rest 語(yǔ)法時(shí),rest 的類型其實(shí)是 obj 類型剔除了 x y z 這三個(gè) key 的類型,現(xiàn)在 ts 已經(jīng)能自動(dòng)做到了!

下面是實(shí)現(xiàn)方式:

interface XYZ {
  x: any;
  y: any;
  z: any;
}

type DropXYZ = Pick>;

function dropXYZ(obj: T): DropXYZ {
  let { x, y, z, ...rest } = obj;
  return rest;
}

通過(guò) Pick & Exclude 達(dá)到剔除 obj 屬性的效果,具體可以參考之前的精讀:精讀《Typescript2.0 - 2.9》。

tsconfig 配置集成支持 node_modules

這是一個(gè)福音,以往在 tsconfig.json 為了繼承一個(gè)配置,我們需要這么寫:

{
  "extends": "../node_modules/@my-team/tsconfig-base/tsconfig.json"
}

TS3.2 內(nèi)置了 node_modules 解析,因此就可以更清晰的描述了:

{
  "extends": "@my-team/tsconfig-base"
}
內(nèi)置 BigInt 類型

新增了 bigint 類型,再也不會(huì)把 bigintnumber 混淆了。

declare let foo: number;
declare let bar: bigint;

foo = bar; // error: Type "bigint" is not assignable to type "number".
bar = foo; // error: Type "number" is not assignable to type "bigint".
3 精讀

這次改動(dòng)意圖非常明顯,是為了跟上 JS 的新語(yǔ)法。隨著 JS 規(guī)范發(fā)展,TS 類型必然要得到補(bǔ)充,像 Object spread 與 Object rest 在項(xiàng)目中使用已經(jīng)非常普遍了,及時(shí)完善類型支持,有助于對(duì)項(xiàng)目類型的約束。

strictBindCallApply 基本可以算是對(duì) React 社區(qū)的回饋。在 React 很早期的版本是支持函數(shù)自動(dòng) bind 的,后來(lái)覺(jué)得過(guò)于 magic 就移除了,由于當(dāng)時(shí)沒(méi)有箭頭函數(shù),大家只好在調(diào)用處 .bind(this) 一下。

后來(lái)有人發(fā)現(xiàn) .bind(this) 會(huì)導(dǎo)致函數(shù)引用變化,對(duì) Mutable 性能優(yōu)化不友好,所以許多代碼都在 constructor 位置進(jìn)行類似 this.fooBind = this.foo.bind(this) 這樣的賦值,如今 TS3.2 對(duì)這種 bind 過(guò)后的函數(shù)也具備了嚴(yán)格的類型推測(cè),將會(huì)有一大批代碼從中受益。

順帶一提,最近 Babel 7.2.0 發(fā)布,也帶來(lái)了一些新特性支持,比如:

提前支持私有屬性:

class Person {
  #age = 19;

  #increaseAge() {
    this.#age++;
  }

  birthday() {
    this.#increaseAge();
    alert("Happy Birthday!");
  }
}

提前支持 pipleline Operator:

const result = 2 |> double |> 3 + # |> toStringBase(2, #); // "111"

整個(gè) JS 生態(tài)一篇欣欣向榮的景象。不過(guò) TS 對(duì) ES 規(guī)范支持還是比較保守的,比如 Babel 6.x 就支持的 optional chain,現(xiàn)在也沒(méi)有得到支持,原因是 “等待進(jìn)入 Stage3”。追蹤 ISSUE 可以參考:https://github.com/Microsoft/...

如果不清楚 Stage3 的含義,可以閱讀前端精讀之前的一篇文章:精讀 TC39 與 ECMAScript 提案。

4 總結(jié)

這次的版本升級(jí)幾乎沒(méi)帶來(lái)什么新語(yǔ)法,只是純粹的類型檢測(cè)能力增強(qiáng),所以如果希望進(jìn)一步提高代碼質(zhì)量,就盡快升級(jí)把。

討論地址是:精讀《Typescript 3.2 新特性》 · Issue #117 · dt-fe/weekly

如果你想?yún)⑴c討論,請(qǐng)點(diǎn)擊這里,每周都有新的主題,周末或周一發(fā)布。前端精讀 - 幫你篩選靠譜的內(nèi)容。

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

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

相關(guān)文章

  • 精讀Typescript2.0 - 2.9》

    摘要:比如或者都會(huì)導(dǎo)致函數(shù)返回值類型時(shí)。和特性一樣,等于是函數(shù)返回值中的或。注意對(duì)比下面的寫法對(duì)于,它的返回值是可迭代的對(duì)象,并且每個(gè)類型都是或者。首先是不支持方法重載的,是支持的,而類型系統(tǒng)一定程度在對(duì)標(biāo),當(dāng)然要支持這個(gè)功能。 1 引言 精讀原文是 typescript 2.0-2.9 的文檔: 2.0-2.8,2.9 草案. 我發(fā)現(xiàn),許多寫了一年以上 Typescript 開(kāi)發(fā)者,對(duì) T...

    william 評(píng)論0 收藏0
  • 精讀《如何編譯前端項(xiàng)目與組件》

    摘要:歷史上由于是作為的替代品出現(xiàn),當(dāng)時(shí)要解決的問(wèn)題是處理瀏覽器兼容問(wèn)題,打包或,做一些公共資源替換,雪碧圖等,最后可以順帶合并到一個(gè)文件,但模塊化功能遠(yuǎn)遠(yuǎn)比弱,基本上只能合并,但不能理解模塊概念。 1 引言 說(shuō)到前端編譯方案,也就是如何打包項(xiàng)目,如何編譯組件,可選方案有很多,比如: 通過(guò) webpack / parcel / gulp 構(gòu)建項(xiàng)目。 通過(guò) parcel / gulp / b...

    jiekechoo 評(píng)論0 收藏0
  • 前端進(jìn)階資源整理

    摘要:前端進(jìn)階進(jìn)階構(gòu)建項(xiàng)目一配置最佳實(shí)踐狀態(tài)管理之痛點(diǎn)分析與改良開(kāi)發(fā)中所謂狀態(tài)淺析從時(shí)間旅行的烏托邦,看狀態(tài)管理的設(shè)計(jì)誤區(qū)使用更好地處理數(shù)據(jù)愛(ài)彼迎房源詳情頁(yè)中的性能優(yōu)化從零開(kāi)始,在中構(gòu)建時(shí)間旅行式調(diào)試用輕松管理復(fù)雜狀態(tài)如何把業(yè)務(wù)邏輯這個(gè)故事講好和 前端進(jìn)階 webpack webpack進(jìn)階構(gòu)建項(xiàng)目(一) Webpack 4 配置最佳實(shí)踐 react Redux狀態(tài)管理之痛點(diǎn)、分析與...

    BlackMass 評(píng)論0 收藏0
  • Electron 14.0.0 發(fā)布、StackBlitz 支持快速創(chuàng)建 Nuxt.js 應(yīng)用 |

    摘要:發(fā)布發(fā)布節(jié)奏變化從月份的開(kāi)始,將每周發(fā)布一個(gè)新的穩(wěn)定版本。將于年月日開(kāi)始測(cè)試,穩(wěn)定版將于年月日發(fā)布。一個(gè)使用和實(shí)現(xiàn)了個(gè)用戶界面的頁(yè)面。實(shí)踐總結(jié)是一個(gè)現(xiàn)代的企業(yè)級(jí)框架,提供了強(qiáng)大的和許多開(kāi)箱即用的功能。 .markdown-body{word-break:break-word;line-height:1.75;font-weight:400;font-size:15px;overflow-x...

    Jensen 評(píng)論0 收藏0
  • 精讀《REST, GraphQL, Webhooks, & gRPC 如何選型》

    摘要:而利用進(jìn)一步提高了序列化速度,降低了數(shù)據(jù)包大小。帶來(lái)的最大好處是精簡(jiǎn)請(qǐng)求響應(yīng)內(nèi)容,不會(huì)出現(xiàn)冗余字段,前端可以決定后端返回什么數(shù)據(jù)。再次強(qiáng)調(diào),相比和,是由前端決定返回結(jié)果的反模式。請(qǐng)求者可以自定義返回格式,某些程度上可以減少前后端聯(lián)調(diào)成本。 1 引言 每當(dāng)項(xiàng)目進(jìn)入聯(lián)調(diào)階段,或者提前約定接口時(shí),前后端就會(huì)聚在一起熱火朝天的討論起來(lái)??赡?99% 的場(chǎng)景都在約定 Http 接口,討論 URL...

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

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

0條評(píng)論

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