Promise.all
的定义,在 3.7
版本中一些混用 null
或 undefined
的时候的问题已经在 3.9
获得了修复。// @ts-expect-error
新注释的添加JavaScript
中 CommonJS
的自动引入tsconfig.json
文件TypeScript
定义和书写规范上的改动和修复之前的 bugs
promise.all
& promise.race
等方法作出了更新,可是也制造出了一个问题。在使用 null
& undefined
尤为明显。nterface Lion {
roar(): void
}
interface Seal {
singKissFromARose(): void
}
async function visitZoo(lionExhibit: Promise<Lion>, sealExhibit: Promise<Seal | undefined>) {
let [lion, seal] = await Promise.all([lionExhibit, sealExhibit]);
lion.roar(); // uh oh
// ~~~~
// Object is possibly 'undefined'.
}
复制代码
这种行为就很奇怪了,实际上
sealExhibit
当中包含的undefined
,至关因而把undefined
错误引入了lion type
当中, 这里是一个错误引用。html
固然在最新的 3.9
版本中修复了这个问题。git
awaited type
awaited type
主要是对如今的 promise
更好的定义和使用。预计在 **`3.9`** 发布的,结果微软又跳票了,能够等下一个版本了。 github
Material-ui
与 Styled-Components
等组件会带来极差的编辑 / 编译速度后。主要从联合类型、交叉类型、条件 判断的 type 类型以及各类映射 type 类型的性能问题来优化。 把相关的库编译时间减小了 40%
左右。Visual Studio Code
团队提供的建议,咱们发如今执行文件重命名时,单是查明哪些导入语句须要更新就要耗去 5
到 10
秒时间。TypeScript 3.9
调整了内部编译器与语言服务缓存文件的查找方式,顺利解决了这个问题。pull request
的具体优化内容
function hasImportantPermissions(): boolean {
// ...
}
// Oops!
if (hasImportantPermissions) {
// ~~~~~~~~~~~~~~~~~~~~~~~
// This condition will always return true since the function is always defined.
// Did you mean to call it instead?
deleteAllTheImportantFiles();
}
复制代码
可是,此错误仅适用于if语句中的条件。如今三元条件(即语法)如今也支持此功能。好比 cond ? trueExpr : falseExpr
typescript
declare function listFilesOfDirectory(dirPath: string): string[];
declare function isDirectory(): boolean;
function getAllFiles(startFileName: string) {
const result: string[] = [];
traverse(startFileName);
return result;
function traverse(currentPath: string) {
return isDirectory ?
// ~~~~~~~~~~~
// This condition will always return true
// since the function is always defined.
// Did you mean to call it instead?
listFilesOfDirectory(currentPath).forEach(traverse) :
result.push(currentPath);
}
}
复制代码
import * as fs from "fs";
复制代码
const fs = require("fs");
复制代码
TypeScript 如今可以自动检测您所使用的导入类型,保证文件样式简洁而统一。如今有了以下自动引入的功能json
const { readFile } = require('fs')
复制代码
// before
let f1 = () => 42
// oops - not the same!
let f2 = () => { 42 }
复制代码
null
断言操做符(!)
的可选链(?.)
行为不符合直觉。具体来说,在以往的版本中,代码:promise
foo?.bar!.baz
复制代码
被解释为等效于如下 JavaScript 代码:缓存
(foo?.bar).baz
复制代码
在以上代码中,括号会阻止可选链的“短路”行为;所以若是未定义
foo
为undefined
,则访问baz
会引起运行时错误。性能优化
换句话说,大多数人认为以上原始代码片断应该被解释为在:bash
foo?.bar.baz
复制代码
中,当 foo
为 undefined
时,计算结果为 undefined
。async
这是一项重大变化,但咱们认为大部分代码在编写时都是为了考虑新的解释场景。若是您但愿继续使用旧有行为,则可在!操做符左侧添加括号,以下所示:
(foo?.bar)!.baz