快捷搜索:

您的位置:澳门新葡4473网站 > 项目 > Google 员工吐槽 TypeScript:我觉得你的类型检查不

Google 员工吐槽 TypeScript:我觉得你的类型检查不

发布时间:2020-03-16 17:43编辑:项目浏览(75)

    多年来名称叫 Evan Martin 的 谷歌(Google卡塔尔 职员和工人在 TypeScript 的 GitHub repo 中刊登了对 TypeScript 的“吐槽”(正是提了三个 issue),说嗤笑恐怕不太合适,正确的话是对 TypeScript 3.5 的采纳报告。

    时间: 2019-12-07阅读: 13标签: 功能1. 可选链

    固然 TypeScript 3.5 公布原来就有四个月(最新稳固版 3.6 已于前段日子月尾发布),但 Google 开采公司前段时间才进级至 3.5 版本。使用一段时间后,开荒者感到一吐为快,于是便有了那篇品质颇高的运用报告。是的,这里说的连串就是被群众使用的 谷歌(Google卡塔尔 —— 那多少个唯有二个代码商旅且装有数十亿行代码的 Google。

    从 v3.7 可用

    背景

    开拓组织面前蒙受的种类是持有数十亿行代码的 谷歌,在组织内部,全体成员利用的是一致版本的 TypeScript 和相近组跨全数平台的编写翻译器标志(compiler flag),如需晋级,成员会支持为全数人同不时候进级那些标识。

    Evan 谈到,他和大家长久以来会希望 TypeScript 的新本子进级能拉动一些改善。比如,Evan表示友好希望并招待对标准库实行修改,固然那有可能代表必要从代码库中除去雷同但不合作的概念。但集体意识此番进级至 TypeScript 3.5 带给的额外工作量要比早先的升级多得多。

    埃文 以为 3.5 版本中有八个至关心注重要变化让此番升高变得越发不便,他深信那一个生成的大部是有其目的的,并且意在更正项目检查,但他也以为TypeScript 团队所精晓的品类检查始终只是在七台河与频率之间掂量。

    Evan 希望那份大型代码库的 TypeScript 使用报告能扶植 TypeScript 共青团和少先队更加好地评估现在左近的情况,并提供一些提出。

    上边看看 Evan 说的 3.5 版本给集体带给影响的多个注重变化。

    那是当您品尝访谈嵌套数据时的三个痛点,嵌套数据越来越多,代码就会变得越繁缛。

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

    此项特征归属 3.5 版本中的破坏性别变化化,Evan以为这里导致现身难题的开始和结果是代码的泛型与代码所做的做事并无相关。举个例子,假诺有一点具有 Promise 深入深入分析的代码,但不关切 Promise 要解析的值:

    function dontCarePromise() {
      return new Promise((resolve) => {
        resolve();
      });
    }
    

    是因为泛型是未绑定的,在 3.4 中为 Promise<{}> 的代码在 3.5 中就能够形成 Promise<unknown>。假使此函数的使用者在任性地方写下了那体系型的 Promise:

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

    那将会导致现身类型错误。

    除了,还大概有一种被誉为“仅再次来到泛型(return-only generics)”的情势,这种景观下,泛型函数仅在回到类型中选用它的轻便形式。这里引致的主题素材是,会产杰出多连串推导意外。比方,在只回去泛型的景色下,宛如下的代码:

    expectsString(myFunction());
    

    能够按以下的方法合法重构:

    const x = myFunction();
    expectsString(x);
    

    但结尾开采,这是无效的。

    在底下的例子中,要拜谒address,你必须要遍历data.customer.address,况且data或customer有希望是undefined,所以普通使用运算符或临近例子中的技艺遍历检查种种等级次序的定义。

    布尔过滤器 filter(Boolean卡塔尔(قطر‎

    TypeScript 3.5 更改了Boolean函数的类型,该函数会强逼赋值给boolean,从

    function Boolean(value?: any): boolean;
    

    变为

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

    双方看起来只怕非常相似。但试想一下,一个函数选拔了叁个谓词并回到叁个数组过滤器,并像上边的代码同样使用:

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

    在 3.4 版本中,遵照定义,T 从 any 变为myFilter,并产生多少个由 any[]到 any[] 的函数。但在 3.5 版本中,T 只保留了泛型。

    当今你可以用.?运算符来选用性地对数据访谈。通过这种方式,假如存在未有定义的父级对象,则会在链中的任何职分重回未定义,并非在运维时崩溃。

    集合(Set)

    在 TypeScript 3.4 中,下边包车型客车代码:

    const s = new Set();
    

    会回到一个 Set<any>。但 TypeScript 3.5 出现了三个转移,使得 lib.es2015.iterable.d.ts 具备移除 any 的机能,然后引致泛型改造上边的描述,并将项目推导为 unknown

    这种更改最后很难修复,因为最终的品种错误不常与实际难题天差地别。譬喻,在如下代码中:

    class C {
      gather() {
        let s = new Set();
        s.add('hello');
        return s;
      }
      use(s: string[]) { … }
      demo() {
        this.use(Array.from(this.gather()));
      }
    }
    

    咱俩会选拔关于 Array.from 类型错误的唤醒,但实在必要修补的是 new Set()

    // v3.7 以前if (data  data.customer  data.customer.address) { const {address} = data.customer const fullAddress = `${address.street}, ${address.city}, ${address.state }${address.zipcode}`}// v3.7// data accessconst address = data?.customer?.addressconst fullAddress = `${address?.street}, ${address?.city}, ${address?.state } ${address?.zipcode}`// 也适用于数组customers?.[0]?.['address']// 检查方法是否已定义并调用customer.approve?.()
    

    最后

    Evan 表示他们对 TypeScript 极其令人满足,本次的选择报告只是希望能给协会在希图新特征时提供多少仿效,以越来越好地开发TypeScript。

    (文/开源中中原人民共和国卡塔尔    

    1. 空值合併

    从 v3.7 可用

    空值归并运算符是||的代表方式,假使左侧是null或undefined,则它回到右边的表达式。那和||有啥样分化?||本质上是 JavaScript 中的布尔 O牧马人 运算符,我们尝试利用短路重回第二个非 false 值。那只怕会发出意想不到的结果,因为当供给数字 0 或空字符串作为有效输入时,将会被视为false。让我们用三个例子来申明:

    // 以前passPhrase = data.inputString || 'Unknown' //不会接受 "" (空字符串)passCode = data.number || '-1111' // 不会接受 0 rememberMe = data.rememberFlag || true // 将会总是 true!!!// 现在passPhrase = data.inputString ?? 'Unknown' //仅在 inputString 未定义时为 UnknownpassCode = data.number ?? '-1111' // 0 可以通过rememberMe = data.rememberFlag ?? true // false 是有效值
    

    由此这种情势得以不言自明所在分undefined与false的值。

    1. 递归类型小名

    从 v3.7 可用

    现实世界中的很许多据类型都以递归的。比方,当您品味管理分层数据时,会意识存在相像连串数据的双重方式。 JSON 是叁个很好的事例,它实质上是二个哈希映射,而哈希映射自身能够分包另一个辉映或映射数组。

    在 v3.6 以前,要是非得定义一个回顾的 JSON 类型,则必须像下边那样:

    interface JSONObject { [x: string]: JSONValue; }interface JSONArray extends ArrayJSONValue { }type JSONValue = string | number | boolean | JSONObject | JSONArray
    

    若是你尝试将第 1 行和第 2 行的种类在像第 3 那样内联,则恐怕会冒出以下错误:Type alias JSONValue circularly references itself。

    在 v3.7 中曾经有效缓和了这些难点,能够像上面这样回顾地拓宽编码:

    type JSONValue = string | number | boolean | { [x: string]: JSONValue } |ArrayJSONValue
    
    1. 预见签字

    从 v3.7 可用

    您应该通晓 TypeScript 具备类型爱惜,能够很好地与 JavaScript 中的typeof和instanceOf运算符一同行使。那有帮忙为函数的参数增加前提条件,以便将其范围为特定的品种。

    让大家写一段把地点提到的那些事物都用到的代码,通过增多类型爱护来确定保证给定的输入是日期,并从当中提取年份:

    function isDate(input: unknown) : asserts input is Date { if (input instanceof Date) return; else throw new Error('Input must be a Date!'); } function getYear(input: unknown) : number { isDate(input); return input.getFullYear() // TypeScripts knows that input is Date } console.log(getYear(new Date('2019-01-01'))); console.log(getYear('2019-01-01')); 
    

    地点的代码看起来十分不利,但 TypeScript 如故会唤醒getFullYear 在鲜为人知类型上不可用。

    从 v3.7 发轫,TypeScript 增多了多个名叫asserts的新注重字,它可以使编写翻译器从断言起就精通科学的花色。对于断言函数,应该加多asserts param as type并非重临类型。

    那般,如果断言通过,TypeScript 将假定参数是后边定义的门类。改进后的代码如下所示:

    function isDate(input: unknown) : asserts input is Date { if (input instanceof Date) return; else throw new Error('Input must be a Date!'); } function getYear(input: unknown) : number { isDate(input); return input.getFullYear() // TypeScripts knows that input is Date } console.log(getYear(new Date('2019-01-01'))); console.log(getYear('2019-01-01')); 
    
    1. 为 Promise 提供越来越好的上报

    从 3.6 起改进

    在代码中向来利用 Promise 而淡忘行使await或then是周围的大错特错,如下所示:

    interface Customer { name: string phone: string}declare function getCustomerData(id: string): PromiseCustomer;declare function payCustomer(customer: Customer): void;async function f() { const customer = getCustomerData('c1') payCustomer(customer)}
    

    先前的 TypeScript 完全不打听 Promise,并显示一条与其非亲非故的谬误音讯,如下所示:

    从 v3. 6 初步,编写翻译器变得特别精晓,可以建议你应该完成Promise。注意最新的编写翻译器是何许管理相像的谬误的:

    上面轻便商量一下不供给浓郁驾驭细节的片段效果与利益:

    1. Unicode 标识符

    从 v3.6 可用

    consthello ="world"
    

    地点的代码可能否够在开始时代版本的 TypeScript 上编写翻译,可是未来您能够从更习以为常的 unicode 集中定义标记符。

    1. 增量编写翻译

    从 v3.4 起可用

    只要您在大型项目上使用 TypeScript,则编写翻译器或许需求非常长日子能力响应你对该代项目中文件所做的变动。未来有了新的--incremental标识,你能够将其增多到tsc(typescript 编写翻译器)命令行中,那一个命令行将会依次增加地编写翻译修改过的文本。

    TypeScript 通过把自从上次编写翻译以来的品种消息保存在代码库内的本土缓存目录中来促成这一目标。在 React 代码库上,必须求记住在Webpack或Parcel举行准确的配置,那样技艺在创设筑管理道中使用增量编写翻译。

    原文:-new-and-exciting-typescript-features-48b760ae0b73

    本文由澳门新葡4473网站发布于项目,转载请注明出处:Google 员工吐槽 TypeScript:我觉得你的类型检查不

    关键词:

上一篇:没有了

下一篇:没有了