page contents

TypeScript 4.6 正式发布,新功能一览

TypeScript 4.6 正式发布了!如果想要使用TypeScript,可以通过NuGet下载,也可以使用npm命令来下载:npm install typescript

attachments-2022-03-4zejOmhv6220196a0bccd.png

TypeScript 4.6 正式发布了!如果想要使用TypeScript,可以通过NuGet下载,也可以使用npm命令来下载:npm install typescript

自测试版和RC版以来有什么新功能?

TypeScript 4.6测试版本以来,有两个比较大的功能改进,分别是面向 Destructured Discriminated Unions(可辨识联合类型)控制流分析和--target es2022,同时另一个值得注意的变化是在react-jsx 模式下删除了void 0 参数。

自RC版本发布之后,TypeScript 团队内部也做了重构,修复了一些问题,纠正了一些奇怪的错误信息,并将部分情况下的类型检查性能提高了3%。

支持super()前执行构造函数代码

在JavaScript类中,引用super() 之前,必须先调用this 。TypeScript也执行了这一点。在TypeScript中,如果一个构造函数的包含类有任何属性初始化器,那么在构造函数的开头包含任何代码都是错误的。

class Base {
    // ...
}

class Derived extends Base {
    someProperty = true;

    constructor() {
        // error!
        // have to call 'super()' first because it needs to initialize 'someProperty'.
        doSomeStuff();
        super();
    }
}

而现在 TypeScript 4.6在检查方面变得更加宽松,允许其他代码在super()...之前运行。

面向 Destructured Discriminated Unions(可辨识联合类型)控制流分析

TypeScript能够根据判别属性来缩小类型。例如,在下面的代码片段中,TypeScript能够通过检查kind 值来缩小action 的类型。

type Action =
    | { kind:  NumberContents , payload: number }
    | { kind:  StringContents , payload: string };

function processAction(action: Action) {
    if (action.kind ===  NumberContents ) {
        // `action.payload` is a number here.
        let num = action.payload * 2
        // ...
    }
    else if (action.kind ===  StringContents ) {
        // `action.payload` is a string here.
        const str = action.payload.trim();
        // ...
    }
}

这一特性使得持有不同数据的对象可以一起工作,不过需要制定一个共同字段来描述这些对象存在哪些数据。

如果想要取消上述例子中的kind 和payload ,可以如下操作。

type Action =
    | { kind:  NumberContents , payload: number }
    | { kind:  StringContents , payload: string };

function processAction(action: Action) {
    const { kind, payload } = action;
    if (kind ===  NumberContents ) {
        let num = payload * 2
        // ...
    }
    else if (kind ===  StringContents ) {
        const str = payload.trim();
        // ...
    }
}

索引访问推理的改进

TypeScript现在可以正确地推断出索引访问类型,立即索引到一个映射的对象类型。

interface TypeMap {
     number : number;
     string : string;
     boolean : boolean;
}

type UnionRecord<P extends keyof TypeMap> = { [K in P]:
    {
        kind: K;
        v: TypeMap[K];
        f: (p: TypeMap[K]) => void;
    }
}[P];

function processRecord<K extends keyof TypeMap>(record: UnionRecord<K>) {
    record.f(record.v);
}

// This call used to have issues - now works!
processRecord({
    kind:  string ,
    v:  hello! ,

    // 'val' used to implicitly have the type 'string | number | boolean',
    // but now is correctly inferred to just 'string'.
    f: val => {
        console.log(val.toUpperCase());
    }
})

--target es2022

TypeScript 现在支持 --target es2022 。这意味着像类字段 (class fields) 这样的特性现在会有一个可以保留的稳定输出 target,也意味着新的内置功能可以使用新的--target 设置,或者使用--lib es2022 。

删除了react-jsx 中不必要的参数

以前,编译如下代码时--jsx react-jsx

export const el = 
foo
;

现在,TypeScript 将生成以下 JavaScript 代码:

import { jsx as _jsx } from  react/jsx-runtime ;
export const el = _jsx( div , { children:  foo  }, void 0);

在这种模式下,最后一个参数void 0是不必要的,删除它可以提高包的大小。

- export const el = _jsx( div , { children:  foo  }, void 0);
+ export const el = _jsx( div , { children:  foo  });

更多相关技术内容咨询欢迎前往并持续关注六星社区了解详情。

如果你想用Python开辟副业赚钱,但不熟悉爬虫与反爬虫技术,没有接单途径,也缺乏兼职经验
关注下方微信公众号:Python编程学习圈,获取价值999元全套Python入门到进阶的学习资料以及教程,还有Python技术交流群一起交流学习哦。

attachments-2022-06-LXQpwDRG62b2d50ab64a8.jpeg

  • 发表于 2022-03-03 09:27
  • 阅读 ( 337 )
  • 分类:行业资讯

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
轩辕小不懂
轩辕小不懂

2403 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1474 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章