2016-06-23 66 views
0

我使用JS /打字稿,并具有下列情形的接口类型:确保嵌套成员

enum ResultFlag { 
    BELOW_MEASUREMENT_RANGE = 1, ABOVE_MEASUREMENT_RANGE, 
    BELOW_PATHOLOGICAL_RANGE, ABOVE_PATHOLOGICAL_RANGE 
} 

const FlagDefs = { 
    [ResultFlag.BELOW_MEASUREMENT_RANGE]: { 
     icon: 'down', color: palette.grey200 
    }, 
    [ResultFlag.ABOVE_MEASUREMENT_RANGE]: { 
     icon: 'up', color: palette.grey200 
    }, 
    [ResultFlag.BELOW_PATHOLOGICAL_RANGE]: { 
     letter: '<', color: palette.accent 
    }, 
    [ResultFlag.ABOVE_PATHOLOGICAL_RANGE]: { 
     letter: '>', color: palette.accent 
    } 
} 

我想确保以下接口FlagDefs成员:

interface IFlagDef { 
    icon?: string; 
    letter?: string; 
    color: string; 
} 

以下不会编译:

const FlagDefs = { 
    [ResultFlag.BELOW_MEASUREMENT_RANGE]: IFlagDef ({ 
     icon: 'down', color: palette.accent 
    }) 
    //... 
} 

以下不编译,但实际上是完全没有意义的,因为ŧ他投只是强制执行不检查任何接口:

const FlagDefs = { 
    [ResultFlag.BELOW_MEASUREMENT_RANGE]: { 
     icon: 'down', color: palette.accent 
    } as IFlagDef 
    //... 
} 

我终于想出了一个有效的解决方案:

const FlagDefs = { 
    [ResultFlag.BELOW_MEASUREMENT_RANGE]: ((): IFlagDef => { return { 
     icon: 'down', color: palette.accent 
    }; })() 
    // ... 
} 

我不知道是否有人知道,确保所有成员的更简单,更直接的方式FlagDefs正确地实现了接口IFlagDef?

回答

1

您可以通过添加明确的类型声明FlagDefs解决这个问题:

type FDStorage = { [key: number]: IFlagDef; }; 

const FlagDefs: FDStorage = { 
    [ResultFlag.BELOW_MEASUREMENT_RANGE]: { 
     icon: 'down', color: palette.accent 
    } 
    // ... 
} 

正如你所看到的,我用number为重点类型,因为枚举值号码,只有numberstring类型都可以作为关键类型。

+0

太棒了!如果删除不再需要的()=> {}闭包攻击,我会将其标记为答案! –

+0

谢谢,我不小心复制并粘贴了错误的代码示例:) – zlumer