Я просто в замешательстве. Я пытаюсь добавить новые объекты в массив в машинописном тексте, но получил ошибку. в моем интерфейсе есть функция. есть ли у кого-нибудь идеи?
interface Videos{
title: string;
description: string;
like: number;
pressLike():void;
pressDislike():void;
}
class Video implements Videos{
public title: string;
public description: string;
public like: number;
constructor(title: string, description: string, like?: number){
this.title = title;
this.description = description;
this.like = like || 0;
}
public pressLike():void{
let ins_like = this.like;
if (ins_like < 0){
this.like = 0;
}else{
this.like++;
}
}
public pressDislike():void{
let ins_like = this.like;
if (ins_like < 0){
this.like = 0;
}else{
this.like--;
}
}
}
var videoArr: Videos[] = [
{"title": "Book 1 Water", "description": "Learn the water bending", "like": 0}
];
// this is where I got the error when I try to add new videos in the array
ошибка говорит об отсутствии свойств pressLike и pressDisplike, но они являются функциями. Я понятия не имею, как добавить их в массив?
Почему бы вам просто не использовать new Video(...)?
Произошла ошибка, поскольку в вашем интерфейсе есть 2 требуемые функции, поэтому вы должны установить их в значении объекта или сделать их необязательными, используя ? или ставь new Video(...), как сказали их ребята



Вы можете добавить несколько статических методов для анализа JSON или создания нового экземпляра объекта:
interface Video {
title: string;
description: string;
likeCount: number;
}
class YouTubeVideo implements Video {
public title: string;
public description: string;
public likeCount: number;
constructor(title: string, description: string, likeCount?: number) {
this.title = title;
this.description = description;
this.likeCount = likeCount ?? 0;
}
public pressLike(): void { /** ... */ }
public pressDislike(): void { /** ... */ }
static parse(data: string): YouTubeVideo {
const parsed: Record<string, object> = JSON.parse(data);
const title: string = parsed.title as unknown as string;
const description: string = parsed.description as unknown as string;
const likeCount: number = parsed.likeCount as unknown as number;
return new YouTubeVideo(title, description, likeCount);
}
static fromObject(data: Video): YouTubeVideo {
return new YouTubeVideo(data.title, data.description, data.likeCount);
}
}
const videoArr: Video[] = [
// Constructor
new YouTubeVideo("Book 1: Water", "Learn water bending"),
// From an object
YouTubeVideo.fromObject({
title: "Book 2: Earth",
description: "Learn earth bending",
likeCount: 0,
}),
// Parsed from JSON data
YouTubeVideo.parse(`{
"title": "Book 3: Fire",
"description": "Learn fire bending",
"likeCount": 0
}`),
];
console.info(videoArr);
Вы должны указать тип объекта, который хотите поместить в массив.
Вот пример:
interface User {
id: number;
name: string;
email: string;
}
const users: User[] = [];
const newUser: User = {
id: 1,
name: 'James',
email: '[email protected]'
};
users.push(newUser);
Вплоть до простого использования того, что уже есть (ваш конструктор):
var videoArr: Videos[] = [
new Video("Book 1 Water", "Learn the water bending", 0),
new Video("Book 2 Earth", "Sokka in the jungle", 4)
];
Если у вас есть хотя бы один класс супертипа (в данном случае Video), можно также вывести тип : Videos[] вашего массива (оставив только var videoArr = [ ... ]). Многие современные IDE (Webstorm/Jetbrains, VSCode и т. д.) также «предварительно просматривают» имена параметров рядом с параметрами вашего конструктора. И наконец, небрежно взгляните на var и let.
Этот объектный литерал не является экземпляром вашего класса. Почему вы пишете это вместо, скажем,
var videoArr: Videos[] = [ new Video("Book 1 Water", "Learn the water bending")];? Если вы используете литералы объектов, вам нужно добавить туда методы самостоятельно. Это полностью отвечает на ваш вопрос или я что-то упускаю?