这个函数里的... 是什么东西,这么神奇,还有函数声明后面的{}。

2016-05-05 11:22:21 +08:00
 vonnyfly
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);
}
4277 次点击
所在节点    JavaScript
25 条回复
frogcjn
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
frogcjn
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.
keyanzhang
2016-06-11 15:31:00 +08:00
keyanzhang
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
vonnyfly
2016-06-17 11:38:07 +08:00
@keyanzhang 写的很好。
其实已多年看代码的经验就明白,只是觉得写的很神奇。
赞你的解释。让我更清楚了语法相关的内容。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/276448

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX