proposal-pattern-matching

Pattern matching syntax for ECMAScript

  • 所有者: tc39/proposal-pattern-matching
  • 平台:
  • 许可证: MIT License
  • 分类:
  • 主题:
  • 喜欢:
    0
      比较:

Github星跟踪图

ECMAScript Pattern Matching

Status

Stage: 1

Author: Kat Marchán (npm, @maybekatz)

Champions: Brian Terlson (Microsoft, @bterlson), Sebastian Markbåge (Facebook, @sebmarkbage), Kat Marchán (npm, @maybekatz)

Introduction

This proposal adds a pattern matching expression to the language, based on the
existing Destructuring Binding
Patterns
.

There's many proposals potentially related to this one, and other proposals
might mention interaction with this. This file includes casual, example-based
discussion of the proposal, and there's also a document describing the core
semantics in more formal language
, which will be iterated over into
the final Spec-ese.

There's also a document including suggestions for other future
proposals
, which are dependent on this one, but do
not directly affect the main behavior of the feature.

This proposal was approved for Stage 1 in the May 2018 TC39 meeting, and slides
for that presentation are
available
.

This proposal draws heavily from corresponding features in
Rust,
F#,
Scala,
and
Elixir/Erlang.

Motivating Examples

Matching fetch() responses:

const res = await fetch(jsonService)
case (res) {
  when {status: 200, headers: {'Content-Length': s}} -> {
    console.log(`size is ${s}`)
  }
  when {status: 404} -> {
    console.log('JSON not found')
  }
  when {status} if (status >= 400) -> {
    throw new RequestError(res)
  }
}

Terser, more functional handling of Redux reducers. Compare with this same
example in the Redux
documentation
:

function todoApp (state = initialState, action) {
  case (action) {
    when {type: 'set-visibility-filter', filter: visFilter} ->
      return {...state, visFilter}
    when {type: 'add-todo', text} ->
      return {...state, todos: [...state.todos, {text}]}
    when {type: 'toggle-todo', index} -> {
      return {
        ...state,
        todos: state.todos.map((todo, idx) => idx === index
          ? {...todo, done: !todo.done}
          : todo
        )
      }
    }
    when {} -> {} // ignore unknown actions
  }
}

Or mixed in with JSX code for quick props handling, assuming implicit do:

<Fetch url={API_URL}>{
  props => case (props) {
    when {loading} -> <Loading />
    when {error} -> <Error error={error} />
    when {data} -> <Page data={data} />
    when _ -> throw new Error('badmatch')
  }
}
</Fetch>

(via Divjot Singh)

General structural duck-typing on an API for vector-likes.

const getLength = vector => {
  case (vector) {
    when { x, y, z } ->
      return Math.sqrt(x ** 2 + y ** 2 + z ** 2)
    when { x, y } ->
      return Math.sqrt(x ** 2 + y ** 2)
    when [...etc] ->
      return vector.length
  }
}
getLength({x: 1, y: 2, z: 3}) // 3.74165

Implementations

主要指标

概览
名称与所有者tc39/proposal-pattern-matching
主编程语言HTML
编程语言HTML (语言数: 3)
平台
许可证MIT License
所有者活动
创建于2017-07-03 21:21:23
推送于2024-09-27 08:08:16
最后一次提交
发布数0
用户参与
星数5.7k
关注者数302
派生数90
提交数427
已启用问题?
问题数252
打开的问题数24
拉请求数62
打开的拉请求数0
关闭的拉请求数22
项目设置
已启用Wiki?
已存档?
是复刻?
已锁定?
是镜像?
是私有?