【问题标题】:Typed object keys by enum - not assignable to type 'string | number | symbol'枚举类型的对象键 - 不可分配给类型 'string |号码 |象征'
【发布时间】:2020-10-20 11:43:18
【问题描述】:

看来我的类型按预期工作。那么请有人帮我解释我在定义中遇到的错误以及如何解决它?我找不到解决办法。

export enum Languages {
  Cs = 'cs',
  Sk = 'sk',
  En = 'en'
}

export type RouteDefinitionItem<T> = {
  name: string;
  pathname: { [index in T]: string };
  page: string;
};

const routes: RouteDefinitionItem<Languages>[] = [
  {
    name: 'home',
    pathname: {
      cs: '/',
      en: '/en',
      sk: '/sk'
    },
    page: '/home'
  }
];

错误:

Type 'T' is not assignable to type 'string | number | symbol'.
  Type 'T' is not assignable to type 'symbol'.

Link to TypeScript playground.

提前谢谢你。

【问题讨论】:

  • 您不能将任何T 用于RouteDefinitionItem,因为只有string | number | symbol 可以是属性。所以限制它 - T extends string | number | symbol.
  • 哦,我明白了。感谢@jonrsharpe,现在它可以工作了。

标签: typescript typescript-typings typescript-generics


【解决方案1】:
export enum Languages {
    Cs = 'cs',
    Sk = 'sk',
    En = 'en'
}



export type RouteDefinitionItem<T extends keyof any > = {
    name: string;
    pathname: Record<T,string>;
    page: string;
};

const routes: RouteDefinitionItem<Languages>[] = [
    {
        name: 'home',
        pathname: {
          'cs':'',
          'en':'',
          'sk':''
        },
        page: '/home'
    }
];

已更新。

【讨论】:

  • 感谢您的回答。但是我对@jonrsharpe 的回答更满意,因为我真的很想使用枚举的值。
  • @TomášVavřinka 已更新。这可能是你想要的。
猜你喜欢
  • 1970-01-01
  • 2023-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-26
  • 1970-01-01
  • 1970-01-01
  • 2021-06-12
相关资源
最近更新 更多