export function create(styles: Object): {[name: string]: number} {
  const platformStyles = {};
  Object.keys(styles).forEach((name) => {
    let {ios, android, ...style} = {...styles[name]};
    if (ios && Platform.OS === 'ios') {
      style = {...style, ...ios};
    }
    if (android && Platform.OS === 'android') {
      style = {...style, ...android};
    }
    platformStyles[name] = style;
  });
  return StyleSheet.create(platformStyles);
}
|      1ayaseangle      2016-05-05 11:28:48 +08:00 via Android annotation ? | 
|  |      2koi      2016-05-05 11:30:45 +08:00 这是 react native 里面的代码吧? react native 貌似用的不是原生的 js 而是 flow.js? 类似 typescript 之类的 | 
|  |      3plantain      2016-05-05 11:44:36 +08:00 via Android 第一个是 es6 的 rest parameter ,第二个是一个类型,函数返回值的类型。 | 
|  |      4plantain      2016-05-05 11:47:11 +08:00 via Android 那个类型里定义了一个 es6 的 computed property | 
|  |      5rogerchen      2016-05-05 11:51:47 +08:00 via Android ...是 destructuring 函数声明后边那个{}是返回值类型声明 这段代码就是 typescript | 
|  |      6iugo      2016-05-05 12:20:48 +08:00 | 
|  |      7broadliyn      2016-05-05 12:39:54 +08:00 醉了,越来越搞不懂 js 要干嘛了。。。。 | 
|      10am241      2016-05-05 12:48:09 +08:00 via Android js 算不算常见语言里语法最奇怪的?感觉已经远超 perl 了 | 
|  |      11learnshare      2016-05-05 12:58:16 +08:00 TypeScript 吧,不过语法还是 ES6/2015/*** | 
|  |      13vonnyfly OP @ayaseangle  @koi @plantain @rogerchen @iugo @adspe 的确是 TypeScript,刚刚看了下语法,发现 JS 的写法越来越逆天了。 这里有 RN javascript 的特殊语法,大概能看懂,自己写有点难: https://facebook.github.io/react-native/docs/javascript-environment.html#javascript-syntax-transformers | 
|  |      14vonnyfly OP 三个点叫做 object spread syntax 。 | 
|      16fds      2016-05-05 14:12:54 +08:00 其实就是为了写起来方便,简化字典操作。 | 
|  |      17Phariel      2016-05-05 14:16:23 +08:00 via Android js 有赶超 ruby 的趋势 | 
|  |      18vonnyfly OP @haozhang  object spread 是 ES7 , Array/call spread 是 ES6 ,应该是这样的。 | 
|  |      20xjp      2016-05-05 21:05:08 +08:00 typeScript  js 的一个超集    现在非常流行 上面这些语法什么的 js 暂时还不支持 之后会支持的 | 
|  |      21frogcjn      2016-05-16 01:48:28 +08:00 @vonnyfly 这个代码是哪里的? TypeScript 还没支持这个 ES8 object property spread and rest 的特性吧? TypeScript 2.1 才有。 https://github.com/Microsoft/TypeScript/wiki/Roadmap | 
|  |      22frogcjn      2016-05-22 01:09:15 +08:00 @vonnyfly 这个应该是 babel+typeflow,  babel-cli 再加上 babel-preset-es2015 ,和 babel-plugin-transform-object-rest-spread 这个插件。 http://babeljs.io/docs/plugins/transform-object-rest-spread/ TypeScript 还不支持 object property spread and rest. | 
|      23keyanzhang      2016-06-11 15:31:00 +08:00 | 
|      24keyanzhang      2016-06-11 15:32:16 +08:00 不知道现在回复是否支持 Markdown 了,如果不支持的话请看上面的 gist 。 这段代码应该来自 https://github.com/fbsamples/f8app/blob/master/js/common/F8StyleSheet.js `...` 是通过 [babel]( http://babeljs.io/) 转译的 Rest/Spread 。具体请看 https://github.com/sebmarkbage/ecmascript-rest-spread - `let {ios, android, ...style} = obj` 可以理解成 `let ios = obj.ios; let android = obj.android; let style = "obj 中除去 ios 和 android 之外的所有 property";` - `let` 右侧的 `{...styles[name]}` 可以理解成 `Object.assign({}, styles[name]);` - 同理,`style = {...style, ...android};` 会被 babel 转译成 `style = Object.assign({}, style, android);` 函数签名中的 `: Object` 以及 `: {[name: string]: number}` 是 [flow]( https://flowtype.org/) 的类型标注(并不是 TypeScript )。换句话说,`create` 这个函数接受一个类型为 `Object` 的参数 `styles`,并返回一个类型为 `{[name: string]: number}` 的值。 - 除去 `number`、`string`、`boolean`、`null` 以及 `undefined` 之外的任何类型均可被标注为 `Object` - https://flowtype.org/docs/objects.html#the-object-type - `{[name: string]: number}` 代表这是一个从 `string` 到 `number` 的映射。举个例子的话,这个函数返回 `{ a: 12, b: 13 }` 是没有问题的,但如果返回 `{ a: 12, b: 'foo' }` 则会报错,因为 `'foo'` 是一个 `string` 而不是 `number` - https://flowtype.org/docs/objects.html#objects-as-maps | 
|  |      25vonnyfly OP |