简体   繁体   English

使用枚举作为 object 文字的键

[英]Use enum as key of a object literal

I keep getting the following error at the line highlighted below:我在下面突出显示的行中不断收到以下错误:

TS7053: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'ICourseContent'. TS7053:元素隐式具有“任何”类型,因为“字符串”类型的表达式不能用于索引类型“ICourseContent”。 No index signature with a parameter of type 'string' was found on type 'ICourseContent'.在“ICourseContent”类型上找不到具有“字符串”类型参数的索引签名。

let elementsRemaining = 0;
[
  CourseContentElementType.AUDIO,
  CourseContentElementType.VIDEO,
  CourseContentElementType.IMAGE,
  CourseContentElementType.DOCUMENT,
  CourseContentElementType.CODE,
  CourseContentElementType.QUIZ,
  CourseContentElementType.EMBED,
].forEach((elementType) => {
  if (
    // Error occurs here
    courseContents[this.getCourseContentIndex(courseContents, selectedCourseContentUid) - 1][
      elementType as string
    ] != null
  ) {
    elementsRemaining++;
  }
});

The object is as follows: object如下:

export interface ICourseContent {
  id: number;
  uid?: string;
  text: ICourseContentElementText;
  button: ICourseContentElementButton[];
  audio?: ICourseContentElementMedia;
  embed?: ICourseContentElementEmbed;
  video?: ICourseContentElementMedia;
  image?: ICourseContentElementImage;
  quiz?: ICourseContentElementQuiz;
  code?: ICourseContentElementCode;
  document?: ICourseContentElementDocuments;
  camera?: ICourseContentElementCamera;
}

The enum is as follows:枚举如下:

export enum CourseContentElementType {
  CARD = 'card',
  TEXT = 'text',
  BUTTON = 'button',
  CODE = 'code',
  DOCUMENT = 'document',
  AUDIO = 'audio',
  VIDEO = 'video',
  IMAGE = 'image',
  QUIZ = 'quiz',
  EMBED = 'embed',
}

How do I create the index signature on ICourseContent so that I can access my index with the enum?如何在 ICourseContent 上创建索引签名,以便我可以使用枚举访问我的索引?

I tried the following:我尝试了以下方法:

export interface ICourseContent {
  id: number;
  uid?: string;
  [key: string]: string;
  text: ICourseContentElementText;
  button: ICourseContentElementButton[];
  audio?: ICourseContentElementMedia;
  embed?: ICourseContentElementEmbed;
  video?: ICourseContentElementMedia;
  image?: ICourseContentElementImage;
  quiz?: ICourseContentElementQuiz;
  code?: ICourseContentElementCode;
  document?: ICourseContentElementDocuments;
  camera?: ICourseContentElementCamera;
}

but I get the error message:但我收到错误消息:

TS2411: Property 'id' of type 'number' is not assignable to string index type 'string'. TS2411:“数字”类型的属性“id”不可分配给字符串索引类型“字符串”。

TS2411: Property 'uid' of type 'string | TS2411:“字符串”类型的属性“uid”| undefined' is not assignable to string index type 'string'. undefined' 不能分配给字符串索引类型'string'。

TS2411: Property 'text' of type 'ICourseContentElementText' is not assignable to string index type 'string'. TS2411:“ICourseContentElementText”类型的属性“文本”不可分配给字符串索引类型“字符串”。

TS2411: Property 'button' of type 'ICourseContentElementButton[]' is not assignable to string index type 'string'. TS2411:“ICourseContentElementButton[]”类型的属性“按钮”不可分配给字符串索引类型“字符串”。

I did this, and the error message went away:我这样做了,错误消息消失了:

  static isEnoughCourseContentElementsPresent(
    courseContents: ICourseContent[],
    selectedCourseContentUid: string,
    elementsRequired = 1
  ): boolean {
    let elementsRemaining = 0;
    [
      CourseContentElementType.AUDIO,
      CourseContentElementType.VIDEO,
      CourseContentElementType.IMAGE,
      CourseContentElementType.DOCUMENT,
      CourseContentElementType.CODE,
      CourseContentElementType.QUIZ,
      CourseContentElementType.EMBED,
    ].forEach((elementType) => {
      if (
        courseContents[this.getCourseContentIndex(courseContents, selectedCourseContentUid) - 1][
          elementType as
            | CourseContentElementType.AUDIO
            | CourseContentElementType.VIDEO
            | CourseContentElementType.IMAGE
            | CourseContentElementType.DOCUMENT
            | CourseContentElementType.CODE
            | CourseContentElementType.QUIZ
            | CourseContentElementType.EMBED
        ] != null
      ) {
        elementsRemaining++;
      }
    });
    if (
      courseContents[this.getCourseContentIndex(courseContents, selectedCourseContentUid) - 1].text
        .html != null
    ) {
      elementsRemaining++;
    }
    return elementsRemaining === elementsRequired;
  }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM