加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

Google员工吐槽TypeScript:我认为你的范例搜查不太好

发布时间:2019-09-13 16:10:53 所属栏目:建站 来源:局长
导读:克日名为 Evan Martin 的 Google 员工在 TypeScript 的 GitHub repo 中颁发了对 TypeScript 的吐槽(就是提了一个 issue),说吐槽也许不太吻合,精确来说是对 TypeScript 3.5 的行使反

克日名为 Evan Martin 的 Google 员工在 TypeScript 的 GitHub repo 中颁发了对 TypeScript 的“吐槽”(就是提了一个 issue),说吐槽也许不太吻合,精确来说是对 TypeScript 3.5 的行使反馈。

Google员工吐槽TypeScript:我认为你的范例搜查不太好

固然 TypeScript 3.5 宣布已有三个月(最新不变版 3.6 已于上月月尾宣布),但 Google 开拓团队最近才进级至 3.5 版本。行使一段时刻后,开拓者认为不吐不快,于是便有了这篇质量颇高的行使反馈。是的,这里说的项目正是被世人行使的 Google —— 谁人只有一个代码客栈且拥稀有十亿行代码的 Google。

配景

开拓团队面临的项目是拥稀有十亿行代码的 Google,在团队内部,全部成员行使的是统一版本的 TypeScript 和统一组跨全部平台的编译器标志(compiler flag),如需进级,成员会帮忙为全部人同时进级这些标志。

Evan 说到,他和各人一样会祈望 TypeScript 的新版本进级能带来一些改造。譬喻,Evan 暗示本身但愿并接待对尺度库举办改造,即便这也许意味着必要从代码库中删除相同但不兼容的界说。但团队发明此次进级至 TypeScript 3.5 带来的特殊事变量要比此前的进级多得多。

Evan 以为 3.5 版本中有三个首要变革让此次进级变得尤其艰巨,他信托这些变革的大大都是有其方针的,而且旨在改造范例搜查,但他也以为 TypeScript 团队所领略的范例搜查始终只是在安详与服从之间衡量。

Evan 但愿这份大型代码库的 TypeScript 行使反馈能辅佐 TypeScript 团队更好地评估将来相同的环境,并提供一些提议。

下面看看 Evan 说的 3.5 版本给团队带来影响的三个首要变革。

泛型的隐式默认值(Implicit default for generics)

此项特征属于 3.5 版本中的粉碎性变革,Evan 以为这里导致呈现题目的缘故起因是代码的泛型与代码所做的事变并无相干。譬喻,假设有一些具有 Promise 理会的代码,但不体谅 Promise 要理会的值:

  1. function dontCarePromise() { 
  2.   return new Promise((resolve) => { 
  3.     resolve(); 
  4.   }); 

因为泛型是未绑定的,在 3.4 中为 Promise<{}> 的代码在 3.5 中就会变为 Promise。假云云函数的行使者在恣意处所写下了这种范例的 Promise:

  1. const myPromise: Promise<{}> = dontCarePromise(); 

这将会导致呈现范例错误。

除此之外,尚有一种被称为“仅返回泛型(return-only generics)”的模式,这种环境下,泛型函数仅在返回范例中行使它的恣意模式。这里导致的题目是,会呈现许多范例推导不测。譬喻,在只返回泛型的环境下,有如下的代码:

  1. expectsString(myFunction()); 

可以按以下的方法正当重构:

  1. const x = myFunction(); 
  2. expectsString(x); 

但最后发明,这是行不通的。

布尔过滤器 filter(Boolean)

TypeScript 3.5 变动了Boolean函数的范例,该函数会逼迫赋值给boolean,从

  1. function Boolean(value?: any): boolean; 

变为

  1. function Boolean<T>(value?: T): boolean; 

两者看起来也许很是相似。但试想一下,一个函数接管了一个谓词并返回一个数组过滤器,并像上面的代码一样行使:

  1. function filter<T>(predicate: (t: T) => boolean): (ts: T[]) => T[]; 
  2. const myFilter = filter(Boolean); 

在 3.4 版本中,按照界说,T 从 any 变为myFilter,并成为一个由 any[]到 any[] 的函数。但在 3.5 版本中,T 只保存了泛型。

荟萃(Set)

在 TypeScript 3.4 中,下面的代码:

  1. const s = new Set(); 

会返回一个 Set。但 TypeScript 3.5 呈现了一个改观,使得 lib.es2015.iterable.d.ts 具有移除 any 的结果,然后导致泛型改变上面的描写,并将范例推导为 unknown。

这种变革最终很难修复,由于最终的范例错误偶然与现实题目相差甚远。譬喻,在如下代码中:

  1. class C { 
  2.   gather() { 
  3.     let s = new Set(); 
  4.     s.add('hello'); 
  5.     return s; 
  6.   } 
  7.   use(s: string[]) { … } 
  8.   demo() { 
  9.     this.use(Array.from(this.gather())); 
  10.   } 

我们会收到关于 Array.from 范例错误的提醒,但现实必要修复的是 new Set()。

最后

Evan 暗示他们对 TypeScript 很是满足,此次的行使反馈只是但愿能给团队在计划新特征时提供些许参考,以更好地开拓 TypeScript。

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读