您当前的位置: 首页 > 

@大迁世界

暂无认证

  • 1浏览

    0关注

    739博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【TS 演化史 - 15】可选的 catch 语句变量 和 JSX 片段语法

@大迁世界 发布时间:2020-02-19 08:30:00 ,浏览量:1

作者:Marius Schulz译者:前端小智来源:https://mariusschulz.com/

TypeScript 2.5 实现了可选的 catch 绑定建议,该建议更改了 ECMAScript 语法,以允许在 catch 子句中省略变量绑定。也就是说,咱们现在可以在try/catch语句中忽略错误变量及其周围的括号:

try {
  // ...
} catch {
  // ...
}

以前,即使不使用变量,也必须始终声明它:

try {
  // ...
} catch (error) {
  // ...
}
成的 JS 代码

如果你的目标ECMAScript版本不支持可选的catch绑定(比如 ES5ES2015),那么TypeScript 编译器将为每个catch子句添加一个变量绑定,这样生成的代码在语法上就有效了。

生成前:

try {
  // ...
} catch {
  // ...
}

下面当咱们以ES5为目标时 TypeScript 编译器生成的 JS 代码:

try {
    // ...
}
catch (_a) {
    // ...
}

如果改为使用--target esnext来编译代码,则生成的不带变量绑定的catch子句将不变:

try {
    // ...
}
catch {
    // ...
}
可选`catch`绑定的用例

通常,咱们不希望忽略应用程序中的错误。至少,希望将它们打印到控制台。然而,在一些罕见的情况下,可能根本不需要 catch 变量绑定。

假设咱们试图将一个错误记录到控制台,然后由于某种原因,日志代码本身会导致另一个错误。咱不希望日志代码抛出错误,所以在这种情况下,没有绑定的catch子句可能是有意义的

function log(error) {
  try {
    console.error(error);
  } catch {
    // There's not much more we can do
  }
}
JSX 片段语法

TypeScript 2.6 添加了对JSX片段的支持。在.tsx文件中,现在可以使用新的 ... 语法来创建片段。

JSX 片段背后的动机

React中,从一个组件返回多个元素是一种常见模式。例如,假设咱们希望在以下组件中渲染多个列表项:

class List extends React.Component {
  render() {
    return (
      
                     
  • Item 3
  •       
    );   } }

然而,在咱们的ListItems组件中,咱们不能像这样简单地返回多个相邻的JSX元素

class ListItems extends React.Component {
  render() {
    return (
      
  • Item 1
  •       
  • Item 2
  •     );   } }

    相邻的JSX元素必须包裹在一个封闭的元素中,因此咱们可以添加一个div元素

    class ListItems extends React.Component {
      render() {
        return (
          
            
  • Item 1
  •         
  • Item 2
  •       
        );   } }

    不幸的是,添加这样的包装器会破坏列表的结构。咱们的ListItems组件当前渲染以下DOM元素

        
          
    • Item 1
    •     
    • Item 2
    •   
        
    • Item 3

    注意,

    不属于这里,咱们可以通过使用JSX片段语法来消除它:

    class ListItems extends React.Component {
      render() {
        return (
          
            
  • Item 1
  •         
  • Item 2
  •            );   } }

    片段允许咱们对多个JSX元素进行分组,而不需要添加额外的节点。现在,List 组件渲染结构就正常了:

        
    • Item 1
    •   
    • Item 2
    •   
    • Item 3

    另外,也可以写React.Fragment来代替新的JSX语法:

    class ListItems extends React.Component {
      render() {
        return (
          
            
  • Item 1
  •         
  • Item 2
  •            );   } }
    使用 TypeScript 编译 JSX 片段

    下面带有新的JSX语法的ListItems组件

    class ListItems extends React.Component {
      render() {
        return (
          
            
  • Item 1
  •         
  • Item 2
  •            );   } }

    如果咱们使用--jsx react(和--target es2015)编译.tsx文件,会生成下面的 JS 代码:

    class ListItems extends React.Component {
      render() {
        return (
          React.createElement(
            React.Fragment,
            null,
            React.createElement("li", null, "Item 1"),
            React.createElement("li", null, "Item 2")
          )
        );
      }
    }
    

    编译器通过调用 React.createElement() 方法来替换片段语法,并将其React.Fragment作为第一个参数传递。

    如果使用--jsx preserve(和--target es2015)来编译ListItems组件,那么生成的代码就不会有变化:

    class ListItems extends React.Component {
      render() {
        return (
          
            
  • Item 1
  •         
  • Item 2
  •            );   } }

    原文:https://mariusschulz.com/blog/optional-catch-binding-in-typescripthttps://mariusschulz.com/blog/jsx-fragment-syntax-in-typescript

    交流

    如何在 Vue 中对事件进行防抖和节流?(小智的第三个视频)

    什么是 globalThis,为什么要学会使用它?

    编写高质量箭头函数的5个最佳做法

    Vue 中如何让 input 聚焦?(包含视频讲解)

    关注
    打赏
    1664287990
    查看更多评论
    立即登录/注册

    微信扫码登录

    0.0388s