[英]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.