// @flow function obj_pattern({ prop } : { prop: X }) {} // prop: X type Prop = { prop: X }; function obj_pattern2({ prop } : Prop) {} // prop: X function arr_pattern([ elem ] : X[]) {} // elem: X type Elem = X[]; function arr_pattern2([ elem ] : Elem) {} // elem: X function tup_pattern([ proj ] : [X]) {} // proj: X type Proj = [X]; function tup_pattern2([ proj ] : Proj) {} // proj: X function rest_pattern(...r: X[]) {} // r: X[] function obj_rest_pattern({ _, ...o } : { _: any, x: X }) { // o: { x: X } o.x; } type ObjRest = { _: any, x: X }; function obj_rest_pattern({ _, ...o } : ObjRest) { // o: { x: X } o.x; } function arr_rest_pattern([ _, ...a ] : [ any, X ]) { // a: [X] a[0]; } type ArrRest = [ any, X ]; function arr_rest_pattern([ _, ...a ] : ArrRest) { // a: [X] a[0]; }