如何定义对象中的值类型而不必使用数组表示法来访问值?

时间:2017-01-05 19:16:41

标签: typescript

我已经定义了这种类型:

type RouteMap = { [k: string]: React.Route };

我试图像这样申请:

const routes: RouteMap = {
  setDomain: { title: 'Set Domain', component: SetDomain }
};

export default class MyClass extends React.Component<void, void> {
  render() {
    return (
      <View style={styles.container}>
        <NavigatorIOS initialRoute={routes.setDomain} />
      </View>
    );
  }
}

但是这会产生这个错误:

Property 'setDomain' does not exist on type RouteMap.

如果我尝试像这样访问该属性,这是有效的:routes['setDomain']但我想避免这种情况。有没有办法让TypeScript仍然推断出赋值中的键?

1 个答案:

答案 0 :(得分:1)

mapped types有点可行,但如果没有中间函数的帮助,typescript将不会推断routes初始值设定项中的类型:

type RouteMap<K extends string> = {[T in K]: React.Route}

// dummy function necessary to infer generic type parameter from the value
function routeMap<K extends string>(r: RouteMap<K>): RouteMap<K> { return r }

const routes = routeMap({
  setDomain: { title: 'Set Domain', component: SetDomain }
});

如果没有routeMap()功能,您必须自己指定密钥类型,这也有效,但看起来很难看:

const routes2: RouteMap<'setDomain'> = {
  setDomain: { title: 'Set Domain', component: SetDomain }
};