将对象值设置为type

时间:2017-07-15 05:33:43

标签: flowtype

我正在尝试设置变量值的类型,而不是它自己的变量。

type FontWeight = 'normal' | 'bold' | '100' | '200' | '300' | '400' | '500' | '600' | '700' | '800' | '900';
type StyleSheetStyle = {};

type FontStyleSheetStyle = { [key:FontWeight]:StyleSheetStyle };

const proximaNova = StyleSheet.create({
    // '100': { fontFamily:'' },
    // '200': { fontFamily:'' },
    '300': { fontFamily:'ProximaNova-Light' },
    '400': { fontFamily:'ProximaNova-Regular' },
    // '500': { fontFamily:'' },
    '600': { fontFamily:'ProximaNova-Semibold' },
    '700': { fontFamily:'ProximaNova-Bold' },
    // '800': { fontFamily:'' },
    // '900': { fontFamily:'' }
}: FontStyleSheetStyle);

在flow.org上,这会警告:

18: }: FontStyleSheetStyle);
     ^ Unexpected token :

我不想这样做:

let proixmaNova: FontStyleSheetStyle = { 100: {} }
proximaNova = StyleSheet.create(proximaNova);

我也有一个附带问题。使用上面的代码,我认为FontStyleSheetStyle是一个密封的对象?怎么能让它需要任何FontWeight作为键和任何其他属性?所以“带有一些必需键的未密封对象”。

2 个答案:

答案 0 :(得分:1)

您需要在create function调用中围绕对象添加其他大括号。这样您就可以将对象转换为所需的FontStyleSheetStyle类型。但如果其余部分输入正确,则根本不需要类型定义。因此,要么添加额外的大括号,要么完全删除类型。

答案 1 :(得分:1)

要回答问题的第二部分,每种类型定义只能有一个索引。为了完成你所要求的,你必须输入"密封"手工类型:

type SealedWithMap = {
  [key: string]: string,
  normal: StyleSheetStyle,
  bold: StyleSheetStyle,
  100: StyleSheetStyle,
  // ... etc ...
};