摘要:引言发布了几个新特性,主要变化是类型检查更严格,对一些时髦功能拓展了类型支持。精读这次改动意图非常明显,是为了跟上的新语法。基本可以算是对社区的回馈。讨论地址是精读新特性如果你想参与讨论,请点击这里,每周都有新的主题,周末或周一发布。
1 引言
Typescript 3.2 发布了几个新特性,主要变化是类型检查更严格,对 ES6、ES7 一些时髦功能拓展了类型支持。
2 概要下面挑一些相对重要配置介绍。
strictBindCallApply对 bind call apply 更严格的类型检测。
比如如下可以检测出 apply 函数参数数量和类型的错误:
function foo(a: number, b: string): string { return a + b; } let a = foo.apply(undefined, [10]); // error: too few argumnts
特别对一些 react 老代码,函数需要自己 bind(this),在没有用箭头函数时,可能经常使用 this.foo = this.foo.bind(this),这时类型可能会不准,但升级到 TS3.2 后,可以准确捕获到错误了。
Object spread 类型自动合并现在 Object spread 类型可以自动合并了:
// Returns "T & U" function mergeObject rest 类型自动剔除(x: T, y: U) { return { ...x, ...y }; }
const { x, y, z, ...rest } = obj;
当我们使用了 Object rest 语法时,rest 的类型其实是 obj 类型剔除了 x y z 这三个 key 的类型,现在 ts 已经能自动做到了!
下面是实现方式:
interface XYZ { x: any; y: any; z: any; } type DropXYZ= Pick >; function dropXYZ (obj: T): DropXYZ { let { x, y, z, ...rest } = obj; return rest; }
通过 Pick & Exclude 达到剔除 obj 属性的效果,具体可以参考之前的精读:精读《Typescript2.0 - 2.9》。
tsconfig 配置集成支持 node_modules这是一个福音,以往在 tsconfig.json 为了继承一个配置,我们需要这么写:
{ "extends": "../node_modules/@my-team/tsconfig-base/tsconfig.json" }
TS3.2 内置了 node_modules 解析,因此就可以更清晰的描述了:
{ "extends": "@my-team/tsconfig-base" }内置 BigInt 类型
新增了 bigint 类型,再也不会把 bigint 和 number 混淆了。
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 精读
这次改动意图非常明显,是为了跟上 JS 的新语法。随着 JS 规范发展,TS 类型必然要得到补充,像 Object spread 与 Object rest 在项目中使用已经非常普遍了,及时完善类型支持,有助于对项目类型的约束。
strictBindCallApply 基本可以算是对 React 社区的回馈。在 React 很早期的版本是支持函数自动 bind 的,后来觉得过于 magic 就移除了,由于当时没有箭头函数,大家只好在调用处 .bind(this) 一下。
后来有人发现 .bind(this) 会导致函数引用变化,对 Mutable 性能优化不友好,所以许多代码都在 constructor 位置进行类似 this.fooBind = this.foo.bind(this) 这样的赋值,如今 TS3.2 对这种 bind 过后的函数也具备了严格的类型推测,将会有一大批代码从中受益。
顺带一提,最近 Babel 7.2.0 发布,也带来了一些新特性支持,比如:
提前支持私有属性:
class Person { #age = 19; #increaseAge() { this.#age++; } birthday() { this.#increaseAge(); alert("Happy Birthday!"); } }
提前支持 pipleline Operator:
const result = 2 |> double |> 3 + # |> toStringBase(2, #); // "111"
整个 JS 生态一篇欣欣向荣的景象。不过 TS 对 ES 规范支持还是比较保守的,比如 Babel 6.x 就支持的 optional chain,现在也没有得到支持,原因是 “等待进入 Stage3”。追踪 ISSUE 可以参考:https://github.com/Microsoft/...
如果不清楚 Stage3 的含义,可以阅读前端精读之前的一篇文章:精读 TC39 与 ECMAScript 提案。
4 总结这次的版本升级几乎没带来什么新语法,只是纯粹的类型检测能力增强,所以如果希望进一步提高代码质量,就尽快升级把。
讨论地址是:精读《Typescript 3.2 新特性》 · Issue #117 · dt-fe/weekly
如果你想参与讨论,请点击这里,每周都有新的主题,周末或周一发布。前端精读 - 帮你筛选靠谱的内容。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/100096.html
摘要:比如或者都会导致函数返回值类型时。和特性一样,等于是函数返回值中的或。注意对比下面的写法对于,它的返回值是可迭代的对象,并且每个类型都是或者。首先是不支持方法重载的,是支持的,而类型系统一定程度在对标,当然要支持这个功能。 1 引言 精读原文是 typescript 2.0-2.9 的文档: 2.0-2.8,2.9 草案. 我发现,许多写了一年以上 Typescript 开发者,对 T...
摘要:历史上由于是作为的替代品出现,当时要解决的问题是处理浏览器兼容问题,打包或,做一些公共资源替换,雪碧图等,最后可以顺带合并到一个文件,但模块化功能远远比弱,基本上只能合并,但不能理解模块概念。 1 引言 说到前端编译方案,也就是如何打包项目,如何编译组件,可选方案有很多,比如: 通过 webpack / parcel / gulp 构建项目。 通过 parcel / gulp / b...
摘要:发布发布节奏变化从月份的开始,将每周发布一个新的稳定版本。将于年月日开始测试,稳定版将于年月日发布。一个使用和实现了个用户界面的页面。实践总结是一个现代的企业级框架,提供了强大的和许多开箱即用的功能。 .markdown-body{word-break:break-word;line-height:1.75;font-weight:400;font-size:15px;overflow-x...
摘要:而利用进一步提高了序列化速度,降低了数据包大小。带来的最大好处是精简请求响应内容,不会出现冗余字段,前端可以决定后端返回什么数据。再次强调,相比和,是由前端决定返回结果的反模式。请求者可以自定义返回格式,某些程度上可以减少前后端联调成本。 1 引言 每当项目进入联调阶段,或者提前约定接口时,前后端就会聚在一起热火朝天的讨论起来。可能 99% 的场景都在约定 Http 接口,讨论 URL...
阅读 1401·2021-11-09 09:45
阅读 1764·2021-11-04 16:09
阅读 1434·2021-10-14 09:43
阅读 1773·2021-09-22 15:24
阅读 1545·2021-09-07 10:06
阅读 1580·2019-08-30 14:15
阅读 970·2019-08-30 12:56
阅读 1551·2019-08-29 17:22